Включить нулевое значение для отображения как 0 PSQL

#sql #postgresql #left-join

#sql #PostgreSQL #левое соединение

Вопрос:

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

Мне было интересно, как сделать так, чтобы даты, в которых у людей есть null, отображались как 0 в столбце count.

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

 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 переходят с 2020-10-20 на 2020-11-03.

Как мне изменить запрос, чтобы отобразить количество 0 для рабочих дней между 10/20 и 11/3?

Спасибо!

Комментарии:

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

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

Ответ №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   │
├───┼──────┼──────┤
│ 1111 │
│ 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  │
├───┼───┼────┤
│ 1111 │
└───┴───┴────┘
 

Если вы хотите сохранить пустые строки из правой таблицы 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   │
├───┼──────┼──────┤
│ 1111 │
│ 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
 

Комментарии:

1. потрясающе, спасибо за визуализацию! это очень помогло!