Включите нулевые счетчики, чтобы показать как 0 PSQL

Я пытаюсь подсчитать сгенерированные лиды и заметил, что у меня есть представитель, которому не хватает данных за две недели. Я предполагаю, что это потому, что этот человек был в отпуске и имел нулевые значения в эти даты, а левое соединение не будет отображать даты с нулевыми значениями.

Мне было интересно, как сделать так, чтобы даты, когда люди имеют нуль, отображались как 0 в столбце подсчета.

Это мой текущий код:

select
  t.date, t.michelle_finwell_target, f.name, f.cat, f.c_date_applied::date,
  Count(f.*) "count"
from servicing_targets t
  left join finwell_leads f on t.date::date = f.c_date_applied::date
Where
  name = 'Michelle'
group by
  t.date, t.michelle_finwell_target, f.name, f.cat, f.c_date_applied::date
order by
  f.c_date_applied::date asc

И это мои результаты:

Столбцы date и c_date_applied перескакивают с 20.10.2020 на 03.11.2020.

Как изменить запрос, чтобы он отображал число 0 для рабочих дней между 20.10 и 3.11?

Спасибо!

Пожалуйста, предоставьте образцы данных и желаемые результаты. У вас много столбцов в предложении group by, но только одна строка в день в наборе результатов, что немного сбивает с толку.

GMB 14.12.2020 19:32

Используйте generate_series(timestamp,timestamp,interval) для создания столбца дат. Присоединяйтесь к ним с этим пользователем. Затем присоединитесь к нему со своими данными.

Lemjur 14.12.2020 20:17
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

where name = 'Michelle' превращает left join в inner join. Сравнивать:

with t1(x) as (values(1),(2)), t2(x,y) as (values(1,11))
select *
from t1 left join t2 on (t1.x = t2.x);
┌───┬──────┬──────┐
│ x │  x   │  y   │
├───┼──────┼──────┤
│ 1 │    1 │   11 │
│ 2 │ ░░░░ │ ░░░░ │
└───┴──────┴──────┘

with t1(x) as (values(1),(2)), t2(x,y) as (values(1,11))
select *
from t1 left join t2 on (t1.x = t2.x)
where t2.y=11;
┌───┬───┬────┐
│ x │ x │ y  │
├───┼───┼────┤
│ 1 │ 1 │ 11 │
└───┴───┴────┘

Если вы хотите сохранить пустые строки из правой таблицы в left join, переместите связанные условия в выражение join:

with t1(x) as (values(1),(2)), t2(x,y) as (values(1,11))
select *
from t1 left join t2 on (t1.x = t2.x and t2.y=11);
┌───┬──────┬──────┐
│ x │  x   │  y   │
├───┼──────┼──────┤
│ 1 │    1 │   11 │
│ 2 │ ░░░░ │ ░░░░ │
└───┴──────┴──────┘

С вашим запросом это должно быть:

select
  t.date, t.michelle_finwell_target, f.name, f.cat, f.c_date_applied::date,
  Count(f.*) "count"
from servicing_targets t
  left join finwell_leads f on t.date::date = f.c_date_applied::date and name = 'Michelle'
group by
  t.date, t.michelle_finwell_target, f.name, f.cat, f.c_date_applied::date
order by
  f.c_date_applied::date asc

классно, спасибо за видос! это очень помогло!

Preston G 14.12.2020 21:27

Другие вопросы по теме