【问题标题】:How to display zero as count if there is no record in data base(oracle) in combination with Date column using spring jpa?如果数据库(oracle)中没有记录结合使用spring jpa的日期列,如何将零显示为计数?
【发布时间】:2020-05-07 12:06:24
【问题描述】:

我想按小时查询表中列值在当天的事务计数,因为我想在图表中显示这些计数。

即使在没有记录的几个小时内我也无法显示结果,在这种情况下我应该打印 0 个计数,我已经尝试过

with tmpTable as 
(
    select 
        (minHourSeq + level-1) hourSeq 
    from 
        (select 
             min(extract (hour from TXN_DATE_TIME)) minHourSeq, 
             max(extract (hour from TXN_DATE_TIME)) maxHourSeq 
         from 
             TRANSACTION_REQUEST) v 
    connect by 
        (minHourSeq + level-1) <= maxHourSeq
)
select 
    a.hourSeq as hour, nvl(count(b.transaction), 0) as count 
from 
    TRANSACTION_REQUEST b, tmpTable a 
where 
    a.hourSeq = extract(hour from b.TXN_DATE_TIME(+)) 
group by 
    a.hourSeq 
order by 
    1;

当我在 Oracle SQL 开发人员中执行它时它正在工作,但是我收到一个错误

ORA-00907: 缺少右括号

在尝试使用我的代码实现时

Query query = entityManager.createNativeQuery(
                "with tmpTable as (select (minHourSeq + level-1) hourSeq from (select min(extract (hour from txnDate)) minHourSeq, max(extract (hour from txnDate)) maxHourSeq from "
                        + TransactionRequest.class.getName()
                        + " ) v connect by (minHourSeq + level-1) <= maxHourSeq) "
                        + "select a.hourSeq as hour,nvl(count(b.transaction),0) as count from "
                        + TransactionRequest.class.getName()
                        + " b,tmpTable a a.hourSeq = extract(hour from b.txnDate(+)) group by a.hourSeq order by 1"); 

【问题讨论】:

  • 任何其他解决方案也会有所帮助

标签: java spring oracle jpa


【解决方案1】:

“其他解决方案”可能会将 CTE 移动到内联视图中;也许您使用的工具无法识别它。像这样的:

  SELECT a.hourSeq AS hour, NVL (COUNT (b.transaction), 0) AS COUNT
    FROM TRANSACTION_REQUEST b,
         -- WITH factoring clause moved into an inline view
         (    SELECT (minHourSeq + LEVEL - 1) hourSeq
                FROM (SELECT MIN (EXTRACT (HOUR FROM TXN_DATE_TIME)) minHourSeq,
                             MAX (EXTRACT (HOUR FROM TXN_DATE_TIME)) maxHourSeq
                        FROM TRANSACTION_REQUEST) v
          CONNECT BY (minHourSeq + LEVEL - 1) <= maxHourSeq) a
   WHERE a.hourSeq = EXTRACT (HOUR FROM b.TXN_DATE_TIME(+))
GROUP BY a.hourSeq
ORDER BY 1;

【讨论】:

  • 抱歉回复晚了,现在收到“SQL 命令未正确结束”
【解决方案2】:

你在query 的值中错过了where,使用这个:

Query query = entityManager.createNativeQuery(
                "with tmpTable as (select (minHourSeq + level-1) hourSeq from (select min(extract (hour from txnDate)) minHourSeq, max(extract (hour from txnDate)) maxHourSeq from "
                        + TransactionRequest.class.getName()
                        + " ) v connect by (minHourSeq + level-1) <= maxHourSeq) "
                        + "select a.hourSeq as hour,nvl(count(b.transaction),0) as count from "
                        + TransactionRequest.class.getName()
                        + " b,tmpTable a where a.hourSeq = extract(hour from b.txnDate(+)) group by a.hourSeq order by 1"); 

【讨论】:

  • 抱歉回复晚了,是的,我在发布查询时错过了哪里,但问题仍然存在
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 2019-05-05
  • 2022-07-27
  • 1970-01-01
相关资源
最近更新 更多