SQL COUNT с условием и без - с помощью JOIN - PullRequest
0 голосов
/ 07 апреля 2020

Моя цель похожа на следующую таблицу:

Key      | Count since date X | Count total
1        | 4                  | 28

С двумя простыми выборами я могу получить следующие значения: (ключ таблицы состоит из 3 столбцов [t$ncmp, t$trav, t$seqn])

1. SELECT COUNT(*) FROM  db.table WHERE t$date >= sysdate-2 GROUP BY t$ncmp, t$trav, t$seqn
2. SELECT COUNT(*) FROM  db.table GROUP BY t$ncmp, t$trav, t$seqn

Как я могу присоединиться к этим операторам?

Что я пробовал:

SELECT n.t$trav, COUNT(n.t$trav), m.total FROM db.table n 
LEFT JOIN (SELECT t$ncmp, t$trav, t$seqn, COUNT(*) as total FROM db.table
           GROUP BY t$ncmp, t$trav, t$seqn) m 
ON (n.t$ncmp = m.t$ncmp AND n.t$trav = m.t$trav AND n.t$seqn = m.t$seqn)
WHERE n.t$date >= sysdate-2
GROUP BY n.t$ncmp, n.t$trav, n.t$seqn

Я пробовал разные варианты, но всегда получал ошибки, такие как «сгруппировано по отсутствует» или «неизвестный классификатор» , Теперь это, по крайней мере, выполняется, но общее значение всегда равно 2.

T$TRAV  COUNT(N.T$TRAV) TOTAL
4       2                   2
29      3                   2
51      1                   2
62      2                   2
16      1                   2
....

Если это имеет значение, я выполню это как OPENQUERY от MSSQLSERVER до Oracle -DB.

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Моя цель похожа на следующую таблицу:

Если это так, то вам кажется, что вам нужна условная агрегация:

select key, count(*) as total,
       sum(case when datecol >= date 'xxxx-xx-xx' then 1 else 0 end) as total_since_x
from t
group by key;

Я не уверен, как это связано на ваши примеры запросов. Я просто не вижу связи между этим кодом и вашим вопросом.

1 голос
/ 07 апреля 2020

Я бы попробовал

GROUP BY n.t$trav, m.total

Вы обычно GROUP BY те же столбцы, что и вы SELECT - за исключением тех, кто является аргументами для установки функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...