如何使用不同的 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 中可用。

希望对您有所帮助

斯蒂芬·李