Итак, я использую Room in Java в Android. Я возвращаю список платежей из базы данных следующим образом: «ВЫБЕРИТЕ IFNULL (SUM (payment), 0) FROM works_db_table WHERE account_year =: year« + »...

1
Naimul Kabir 15 Янв 2021 в 08:51

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
1
forpas 15 Янв 2021 в 06:41

Людям легко сделать вывод, что месяца не хватает, но, поскольку данных технически не существует, база данных не знает, что они должны быть там. Решение состоит в том, чтобы создать «заполнитель» месяцев / дат без каких-либо выплат по ним.

(Отказ от ответственности: я нашел это на другом форуме, но сейчас не могу найти. Есть несколько способов сделать это)

Я не очень хорошо знаком с 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, и он заполнит пробелы.

1
joeworkstack 15 Янв 2021 в 06:11
65731128