我正在使用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();
答案 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
;