Как получить нулевые столбцы, когда нет данных на конкретную дату в PostgresSql с Springboot - PullRequest
0 голосов
/ 04 декабря 2018

Я использую PostgreSql.У меня есть запрос, который дает значения для определенного диапазона дат.Как я могу получить столбцы как ноль, когда нет данных на определенную дату.Пример: диапазон дат от 2018-06-10 до 2018-06-16, и нет данных для дат 2018-06-15 и 2018-06-16.Мой существующий запрос возвращает данные за 10, 11, 12, 13 и 14, но не 15 и 16.Как я могу получить 15-ю и 16-ю даты со столбцами в виде нулей.

вот мой запрос:

 SELECT 40                             AS clientId, 
        0                              AS accountId, 
        0                              AS searchEngineId, 
       'present'                       AS dateType, 
       SUM(em.clicks)                  AS clicks, 
       To_date(em.DATE, 'YYYY-MM-dd')  AS date 
FROM   emailreportstats em 
WHERE  em.clientid = 40 
       AND em.accountid IN ( 13, 14 ) 
       AND em.DATE BETWEEN '2018-06-10' AND '2018-06-16' 
GROUP  BY em.DATE, 
          em.datetype;

Код для выполнения запроса:

Query query = em.createQuery(pSqlQuery, EmailReportStats.class);
emailReportStatses = query.getResultList();

1 Ответ

0 голосов
/ 04 декабря 2018

Вам нужен calendar стол.Вы можете создать его на лету (доступно только для этого запроса), используя функцию generate_series.Затем вы просто присоедините свою emailreportstats к этой таблице, чтобы охватить все даты, даже если их нет в вашей таблице электронной почты.

Я добавил coalesce() перенос к вашим рассчитанным кликамстолбец, а также поменял местами вход для столбца date.

Насколько я могу сказать, не имея никаких структур таблиц и примеров данных для его проверки.

SELECT  
  40                              AS clientId, 
  0                               AS accountId, 
  0                               AS searchEngineId, 
  'present'                       AS dateType, 
  COALESCE(SUM(em.clicks),0)      AS clicks, 
  calendar.dt                     AS date 
FROM ( 
 SELECT dt::date as dt
 FROM generate_series('2018-06-10', '2018-06-16', '1 day') g(dt) -- input your dates here
) calendar
LEFT JOIN emailreportstats em ON
  calendar.dt = em.date::date
WHERE
  em.clientid = 40 
  AND em.accountid IN ( 13, 14 )
GROUP BY 
  calendar.dt, 
  em.datetype
;
...