#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 │
├───┼──────┼──────┤
│ 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
Комментарии:
1. потрясающе, спасибо за визуализацию! это очень помогло!