Итак, я использую Room in Java в Android. Я возвращаю список платежей из базы данных следующим образом: «ВЫБЕРИТЕ IFNULL (SUM (payment), 0) FROM works_db_table WHERE account_year =: year« + »...
2 ответа
Вам нужен запрос, который возвращает все месяцы 1–12, а затем LEFT
присоединяет его к таблице:
SELECT IFNULL(SUM(w.payment), 0)
FROM (
SELECT 1 month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8
SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
) m LEFT JOIN works_db_table w
ON w.account_month = m.month AND w.account_year = :year
GROUP BY m.month
Людям легко сделать вывод, что месяца не хватает, но, поскольку данных технически не существует, база данных не знает, что они должны быть там. Решение состоит в том, чтобы создать «заполнитель» месяцев / дат без каких-либо выплат по ним.
(Отказ от ответственности: я нашел это на другом форуме, но сейчас не могу найти. Есть несколько способов сделать это)
Я не очень хорошо знаком с Room, но на SQL-сервере я использую этот запрос:
-- Set the start date of the data
DECLARE @DateFrom date = CAST('2020-01-01' as date);
-- Set the end date of the data
DECLARE @DateTo date = CAST('2020-12-31' as date);
-- Generate a table with one entry per month
WITH DateRanges AS
(
SELECT @DateFrom AS 'DateValue'
UNION ALL
SELECT DATEADD(MONTH, 1, DateValue)
FROM DateRanges
WHERE DateValue < @DateTo
)
select
*
from
DateRanges
Просто объедините существующие данные с CTE DateRanges, и он заполнит пробелы.
Новые вопросы
android
Android - это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфоны, планшеты, автомобили, телевизоры, одежда, стекло, IoT). Для тем, связанных с Android, используйте специальные теги Android, такие как android-intent, android-activity, android-адаптер и т. Д. Для вопросов, не связанных с разработкой или программированием, но связанных с платформой Android, используйте эту ссылку: https: // android.stackexchange.com .