【问题标题】:How to get columns as zero when there is no data for a specific date in PostgresSql with Springboot当使用 Spring Boot 在 Postgresql 中没有特定日期的数据时,如何将列设为零
【发布时间】:2019-05-05 18:57:50
【问题描述】:

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

【问题讨论】:

  • 您需要对日历进行外部连接(或使用generate_series() 即时生成)
  • @a_horse_with_no_name 你能帮帮我吗?我做不到。
  • 我试过了,还是没有成功:选择40作为client_id,stats.clicks作为点击,d.day AS date from (SELECT generate_series(timestamp '2018-06-10', timestamp ' 2018-06-16', 间隔 '1 天')::date) d(day)LEFT JOIN (选择 40 作为 clientId, sum(em.clicks) 作为 clicks, to_date(em.date, 'YYYY-MM-dd ') 作为来自 EmailReportStats em 的日期,其中 em.clientId = 40 和 (13,14) 中的 em.accountId 和 em.date 在 '2018-06-10' 和 '2018-06-16' 之间按 em.date、em 分组.dateType)stats ON stats.date = d.day ORDER BY date asc;

标签: postgresql spring-boot hql jpql


【解决方案1】:

您需要一个calendar 表。您可以使用generate_series 函数即时生成一个(仅适用于此查询)。然后,您可以将您的 emailreportstats 外部连接到该表,这样您就可以涵盖所有日期,即使它们不在您的电子邮件表中。

我已将coalesce() wrap 添加到您计算的点击次数列中,并将输入交换为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
;

【讨论】:

  • 我已经尝试过您提供的解决方案,但出现以下异常:ERROR 29696 --- [nio-8081-exec-4] ohhql.internal.ast.ErrorCounter :第 8:6 行:意外令牌:(
  • 您能否先验证查询是否在 Postgresql 本身中工作,然后在 hql 中尝试?我不确定 hql 不明白什么。最好先确认它是否在 psql 中工作(通过命令行或任何其他图形工具连接)。我不是 hql 方面的专家。
  • 该查询在 Postgresql 工具中运行良好,但在运行 java 代码时会出现异常,指出缺少列(我们不查询的列)。
  • 我相信这是由于 hql 的限制。您可能会将calendar 部分重写为视图或存储过程,并在 hql 查询中使用它。
猜你喜欢
  • 1970-01-01
  • 2022-08-09
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
相关资源
最近更新 更多