Проблема с пробелами в данных с generate_series - PullRequest
0 голосов
/ 06 ноября 2019

Мне нужен запрос, который возвращает совокупную сумму всех оплаченных счетов за день в текущем месяце.

Я пробовал несколько кодов, включая этот:

SELECT DISTINCT 
         month.day,
         sum(bills.value) OVER (ORDER BY month.day)
FROM generate_series(1,31) month(day)
  LEFT JOIN bills ON date_part('day',bills.payment_date) = month.day
WHERE
(
(date_part('year',bills.payment_date)=date_part('year',CURRENT_DATE)) AND
(date_part('month',bills.payment_date)=date_part('month',CURRENT_DATE))
)
GROUP  BY month.day, bills.value, bills.payment_date
ORDER  BY month.day

Я получаю:

day  | value  
1    |  1000   
4    |  3000   
5    |  5000

Сумма верна, но я не получаю все 31 день от функции generate_series. Кроме того, когда я удаляю команду DISTINCT, запрос просто повторяет дни, например:

day  | value  
1    |  1000   
4    |  3000   
4    |  3000  
4    |  3000  
4    |  3000  
5    |  5000   
5    |  5000   

Что я хочу:

day  | value  
1    |  1000   
2    |  1000   
3    |  1000  
4    |  3000  
5    |  5000  
6    |  5000   
...  |  5000   
31   |  5000  

Есть идеи?

1 Ответ

0 голосов
/ 06 ноября 2019

Удалите bills.value, bills.payment_date из группы, тогда вам также не нужно больше отличаться. Вы также можете упростить предложение WHERE. Но вам нужно перевести это условие в состояние JOIN, иначе оно превратит внешнее соединение во внутреннее соединение.

SELECT month.day,
       sum(sum(bills.value)) over (order by month.day) as total_value
FROM generate_series(1,31) month(day)
  LEFT JOIN bills
        ON date_part('day',bills.payment_date) = month.day
       AND to_char(bills.payment_date, 'yyyymm') = to_char(current_date, 'yyyymm')
GROUP  BY month.day
ORDER  BY month.day
...