如何使用不同的 where 语句 select 来自同一列的值 - SQL
How to select values from same column using different where statements - SQL
我有以下代码。
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
以上查询提供每月潜在客户。
然后我有另一个查询,它只提供 "Rent" 个线索。
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
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 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;
我在这种情况下使用的一个选项是使用联合:
将您的第一个查询用作
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...
这有效,但意味着您有效地阅读了主 table 两次,另一种方法是使用 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
我不确定解码是否在其他 SQL 中可用。
希望对您有所帮助
斯蒂芬·李
我有以下代码。
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
以上查询提供每月潜在客户。
然后我有另一个查询,它只提供 "Rent" 个线索。
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
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 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;
我在这种情况下使用的一个选项是使用联合:
将您的第一个查询用作
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...
这有效,但意味着您有效地阅读了主 table 两次,另一种方法是使用 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
我不确定解码是否在其他 SQL 中可用。
希望对您有所帮助
斯蒂芬·李