Группировать по и рассчитывать для всех идентификаторов - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь подсчитать количество записей в соединении таблицы, где флаг для столбца в таблице - «A», «B» или «C».Мне также нужно, чтобы это возвращало счетчик 0, когда строк не существует (поэтому мне нужно, чтобы A, B и C возвращались каждый раз с их относительными счетами).

Мой запрос

Select t1.Num, t2.Flag, count(*)
from t1, t2
where t1.id = t2.id
and t2.flag in ('A','B','C')
group by t1.Num, t2.flag

Это, конечно, будет только возвращать нижеприведенное, так как нет никаких записей для 'C'

Num  Flag  Count

1    A     3

1    B     2 

Можно ли как-нибудь вернуть 0 для C, как показано ниже?

Num  Flag  Count

1    A     3

1    B     2 

0    C     0

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Вместо из in вы должны использовать left join.У вас, похоже, уже есть join, поэтому запрос выглядит так:

Select t1.Num, f.Flag, count(t1.id)
from (select 'A' as flag from dual union all
      select 'B' as flag from dual union all
      select 'C' as flag from dual
     ) f left join t2
     on t2.flag = f.flag left join
     t1
     on t1.id = t2.id
group by t1.Num, f.flag;
0 голосов
/ 24 сентября 2018

Похоже, Внешнее соединение должны войти в игру:

SQL> with
  2  t1 (id, num) as
  3    (select 1, 100 from dual union all
  4     select 2, 200 from dual
  5    ),
  6  t2 (id, flag) as
  7    (select 1, 'A' from dual union all
  8     select 2, 'B' from dual union all
  9     select 3, 'C' from dual
 10    )
 11  select nvl(t1.num, 0) num,
 12         t2.flag,
 13         count(t1.num) cnt
 14  from t2 left join t1 on t2.id = t1.id
 15  where t2.flag in ('A', 'B', 'C')
 16  group by t1.num, t2.flag;

       NUM F        CNT
---------- - ----------
       100 A          1
       200 B          1
         0 C          0

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