Как отобразить ноль как счетчик, если в базе данных нет записи (oracle) в сочетании со столбцом даты с использованием spring jpa? - PullRequest
0 голосов
/ 07 мая 2020

Я хочу запросить количество транзакций для значений столбца в таблице по часам за текущий день, потому что я хочу показать это количество на графике.

У меня проблемы с отображением результатов даже для часов без записей, в этом случае я должен напечатать 0 count, я пробовал с

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"); 

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Вы пропустили where в значении query, используйте это:

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"); 
0 голосов
/ 07 мая 2020

«Другое решение» может заключаться в перемещении 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...