У меня есть следующий код.
SELECT
TO_CHAR(a.created_at, 'YYYY.MM') AS Datum,
count(distinct(a.lead_demand_user_id)) AS Total_Leads
FROM
leads a
WHERE
date(a.created_at) BETWEEN '2017-06-01'
AND 'TODAY'
AND a.lead_delivery_time IS NOT NULL
AND a.lead_filler IN ('Android', 'iOS', 'MobileWeb', 'Web')
GROUP BY 1
Вышеприведенный запрос предоставляет ежемесячные лидеры.
Затем у меня есть другой запрос, который предоставляет только "Аренда".
SELECT
TO_CHAR(a.created_at, 'YYYY.MM') AS Datum,
count(distinct(a.lead_demand_user_id)) AS Rent_Leads
FROM
leads a
WHERE
date(a.created_at) BETWEEN '2017-06-01'
AND 'TODAY'
AND a.lead_delivery_time IS NOT NULL
AND a.lead_filler IN ('Android', 'iOS', 'MobileWeb', 'Web')
AND a.service IN ('Leads::Rent')
GROUP BY 1
Теперь я могу создать два отдельных запроса, однако мне нужно, чтобы оба значения отображались по одному запросу в следующем формате
Месяц → Всего потенциальных клиентов → Аренда потенциальных клиентов
Я попытался использовать, объединить, объединить, подзапрос, но не смог получить нужные данные.
Как насчет этого:
SELECT t1.Datum AS Month, t1.Total_Leads AS Total, t2.Rent_Leads AS Rent
FROM (SELECT * FROM (SELECT TO_CHAR(a.created_at, 'YYYY.MM') AS Datum, count(distinct(a.lead_demand_user_id)) AS Total_Leads
FROM leads a
WHERE date(a.created_at) BETWEEN '2017-06-01'
AND 'TODAY'
AND a.lead_delivery_time IS NOT NULL
AND a.lead_filler IN ('Android', 'iOS', 'MobileWeb', 'Web')) AS x
GROUP BY 1
) AS t1
INNER JOIN (SELECT * FROM (SELECT TO_CHAR(b.created_at, 'YYYY.MM') AS Datum, count(distinct(b.lead_demand_user_id)) AS Rent_Leads
FROM leads b
WHERE date(b.created_at) BETWEEN '2017-06-01'
AND 'TODAY'
AND b.lead_delivery_time IS NOT NULL
AND b.lead_filler IN ('Android', 'iOS', 'MobileWeb', 'Web')
AND b.service IN ('Leads::Rent')) AS y
GROUP BY 1
) AS t2
ON t1.Datum = t2.Datum;
Вариантом, который я использовал в этой ситуации, является использование union:
Используйте свой первый запрос как
SELECT
TO_CHAR(a.created_at, 'YYYY.MM') AS Datum,
count(distinct(a.lead_demand_user_id)) AS Total_Leads, 0 as Rent_leads...
объединяй это со своим вторым, как
SELECT
TO_CHAR(a.created_at, 'YYYY.MM') AS Datum,
0 as Total_Leads,
count(distinct(a.lead_demand_user_id)) AS Rent_Leads...
Это работает, но означает, что вы эффективно читаете основную таблицу дважды, альтернативой является использование факта, что NULLS не учитываются. Я предположил, что lead_demand_user_id - это число. В Oracle вы можете использовать Decode(a.service,'Leads::Rent',1,null)
чтобы создать либо 1, либо null.then count (distinct(a.lead_demand_user_id)*Decode(a.service,'Leads::Rent',1,null)) as Rent_Leads
Я не уверен, что Decode доступен в других SQL.
Надеюсь это поможет
Стивен Л. Ли
Попробуй это:
SELECT
TO_CHAR(a.created_at, 'YYYY.MM') AS Datum,
count(distinct(a.lead_demand_user_id)) AS Total_Leads,
sum(case when a.service IN ('Leads::Rent') then 1 else 0 end) AS Rent_Leads
FROM leads a
WHERE date(a.created_at) BETWEEN '2017-06-01'
AND 'TODAY'
AND a.lead_delivery_time IS NOT NULL
AND a.lead_filler IN ('Android', 'iOS', 'MobileWeb', 'Web')
GROUP BY 1
SELECT *
вне подзапроса, чтобы обойти ошибку.