получение нескольких отсчетов в SQL - PullRequest
1 голос
/ 04 августа 2020

Я хочу, чтобы мой sql запрос возвращал мне количество всех активных и прошлых обращений. Я пробовал такой запрос,

SELECT 
    sum(case when need_By > sysdate and status not in (30,40,50) then 1 else 0 end) AS active,
    sum(case when need_by < sysdate and status not in (30,40,50) then 1 else 0 end) AS past
FROM discrepancy
GROUP BY id;

Это дает мне следующий вывод:

ACTIVE PAST
0      1
1      0
0      0
0      1
0      1

Я ожидаю,

ACTIVE PAST
  1      3

Как мне измените запрос, чтобы получить количество активных и прошлых записей. Также этот запрос будет выполнен в спящем режиме, поэтому мы хотим убедиться, что createNativeQuery работает.

1 Ответ

1 голос
/ 04 августа 2020

Удалите GROUP BY:

SELECT sum(case when need_By > sysdate and status not in (30,40,50) then 1 else 0 end) AS active,
       sum(case when need_by < sysdate and status not in (30,40,50) then 1 else 0 end) AS past
FROM discrepancy;

MySQL также имеет удобную сокращенную запись, чтобы вы могли напрямую подсчитывать логические выражения:

SELECT SUM(need_By > sysdate and status not in (30,40,50)) AS active,
       SUM(need_by < sysdate and status not in (30,40,50)) AS past
FROM discrepancy;

И, наконец, вы можете переместить NOT IN в предложение WHERE, что может улучшить производительность:

SELECT SUM(need_By > sysdate) AS active,
       SUM(need_by < sysdate) AS past
FROM discrepancy
WHERE status NOT IN (30, 40, 50);

EDIT:

В Oracle последний будет:

SELECT SUM(CASE WHEN need_By > sysdate THEN 1 ELSE 0 END) AS active,
       SUM(CASE WHEN need_by < sysdate THEN 1 ELSE 0 END) AS past
FROM discrepancy
WHERE status NOT IN (30, 40, 50);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...