使用Springboot在PostgresSql中没有特定日期的数据时如何将列设为零

时间:2018-12-04 10:59:30

标签: postgresql spring-boot hql jpql

我正在使用PostgreSql。我有一个查询,提供特定日期范围的值。在特定日期没有数据时,如何将列设为零。 示例:日期范围为“ 2018-06-10”至“ 2018-06-16”,并且没有日期为2018-06-15和2018-06-16的数据。我现有的查询返回的数据分别是10th,11th,12th,13th和14th,而不是15th和16th。如何获得第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 :(得分:0)

您需要一个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
;