count(*)=0 не выводит строки с 0, не join запрос

Рейтинг: 0Ответов: 3Опубликовано: 07.03.2023

В таблицу не попадают строки с quest_rk, у которых количество равно 0...

Запрос:

Select
quest_rk, count(*) as cnt
From
my_analytics.game
where (quest_rk = 31 or quest_rk = 7 or quest_rk = 9 or quest_rk = 19) 
and (game_dttm > '2022-11-30 23:59:59.999' and game_dttm < '2023-01-01 00:00:00.000')
group by quest_rk 
order by quest_rk

Подскажите, плиз, как быть...

Ответы

▲ 1Принят

Добиться результата удалось, создав отдельным запросом дополнительную таблицу из нужных мне quest_rk и объединив её с выборкой подходящих под критерии игр (game) через left join. Тогда в итоговой таблице проставляются нули, и все quest_rk из дополнительной таблицы есть.

Select
t1.quest_rk, count(t2.quest_rk) as cnt
From 
(
select quest_rk
from my_analytics.quest
where quest_rk in (7,9,19,31)
) t1
left join my_analytics.game t2 
    on t1.quest_rk=t2.quest_rk
and (game_dttm > '2022-11-30 23:59:59.999' 
     and game_dttm < '2023-01-01 00:00:00.000')
and (game_flg = 1)
group by t1.quest_rk 
order by t1.quest_rk
▲ 1

Не проверял:

Select
t2.quest_rk, count(t1.quest_rk) as cnt
From (
my_analytics.game
where (quest_rk = 31 or quest_rk = 7 or quest_rk = 9 or quest_rk = 19) 
and (game_dttm > '2022-11-30 23:59:59.999' and game_dttm < '2023-01-01 00:00:00.000')
) t1  right join my_analytics.game t2 on t1.quest_rk=t2.quest_rk
group by t2.quest_rk 
order by t2.quest_rk
▲ 1

Могу предложить вот такой вариант, если я правильно понял, что хочется получить:

select a.quest_rk, count(g.quest_rk) from
(
  select 1 quest_rk from dual
  union
  select 2 from dual
  union
  select 3 from dual
  union
  select 4 from dual
  union
  select 6 from dual
) a
left join game g on a.quest_rk=g.quest_rk
group by a.quest_rk

Создаем выборку из нужных значений, далее при помощи left join цепляем нужную таблицу и считаем count(quest_rk) (не count(*) - т.к. со * считаются строки, а при указании столбца считаются значения, отличные от null)