通过CASE表达式统计失去的客户与活跃的客户

时间:2019-06-05 08:09:44

标签: sql case

我正在尝试与丢失/活动的客户创建标志。我有4个季度,如果他们在最近两个季度(0,1)中没有购买,我认为它们已经丢失。但是,尽管他们在剩余的两个季度(2,3)都有收入,但我想对整个ID应用该标志。现在显示我输掉​​了0,1,但是如果有收入,我就输了2,3。

我知道情况不正确时的情况,并根据我在此处写的内容显示结果,但不知道如何解决。

我尝试过的事情:

CASE WHEN ISNULL(Q_0_Flag, 0) = 1 AND ISNULL(Q_1_Flag, 0) = 1 THEN 'Active' 
     WHEN ISNULL(Q_0_Flag, 0) = 0 AND ISNULL(Q_1_Flag, 0) = 1 THEN 'Active' 
     WHEN ISNULL(Q_0_Flag, 0) = 1 AND ISNULL(Q_1_Flag, 0) = 0 THEN 'Active' 
     ELSE 'Lost' 
END AS 'PR Flag' 

完整代码

  SELECT DISTINCT 
            [crm bp id], 
            revenue, 
            qtr, 
            qtr_flag, 
            Q_0_Flag, 
            Q_1_Flag, 
          CASE
                WHEN ISNULL(Q_0_Flag, 0) = 1
                     AND ISNULL(Q_1_Flag, 0) = 1
                THEN 'Active'
                WHEN ISNULL(Q_0_Flag, 0) = 0
                     AND ISNULL(Q_1_Flag, 0) = 1
                THEN 'Active'
                WHEN ISNULL(Q_0_Flag, 0) = 1
                     AND ISNULL(Q_1_Flag, 0) = 0
                THEN 'Active'
                ELSE 'Lost'
            END AS 'PR Flag'
     FROM
     (
         SELECT a.[crm bp id], 
                ISNULL(h.rev, 0) AS revenue, 
                a.qtr, 
                h.qtr_flag,
                CASE
                    WHEN a.qtr IN('Q120')
                         AND ISNULL(h.rev, 0) <> 0
                    THEN 1
                    ELSE 0
                END AS 'Q_0_Flag',
                CASE
                    WHEN a.qtr IN('Q419')
                         AND ISNULL(h.rev, 0) <> 0
                    THEN 1
                    ELSE 0
                END AS 'Q_1_Flag'
         FROM Accounts AS A
              LEFT JOIN
         (
             SELECT crm_bp_id, 
                    ISNULL(SUM(net_revenue), 0) AS rev, 
                    [Cal].[Qtr_Flag], 
                    cal.lqyy
             FROM Historical Revenue AS h
                  LEFT JOIN Calendar AS cal ON cal.cdate = h.inv_date
             WHERE cal.qtr_flag IN('1', '2', '3')
                  AND [Business_Group] <> 'DCG'
             GROUP BY h.crm_bp_id, 
                      cal.qtr_flag, 
                      cal.lqyy
             UNION ALL
             SELECT a.crm_bp_id, 
                   ISNULL(SUM(net_revenue), 0) AS rev, 
                   [Cal].[Qtr_Flag], 
                   cal.lqyy
            FROM Actual Revenue AS a
                 LEFT JOIN Calendar AS cal ON cal.cdate = a.inv_date
            GROUP BY crm_bp_id, 
                     [Cal].[Qtr_Flag], 
                     cal.lqyy
        ) AS h ON h.crm_bp_id = A.[crm bp id]
                  AND h.lqyy = a.qtr
    ) AS T

我得到的

ID QTR Rev Flag
1  0    0   Lost
1  3  1000  Active
2  1  2000  Active
2  1  2000  Active
2  1  2000  Active

我想要的

ID QTR Rev Flag
1  0    0   Lost
1  3  1000  Lost
2  1  2000  Active
2  1  2000  Active
2  1  2000  Active

1 个答案:

答案 0 :(得分:0)

根据您的评论,即您不需要查看季度数据,您的最终声明可以是:

SELECT
     [crm bp id], 
     LastYearRevenue = sum(revenue), 
     PR_Flag = 
          CASE (SUM(Q_0_Flag) > 0) OR (SUM(Q_1_Flag) > 0) 
               THEN 'Active' 
               ELSE 'Lost'
          END
From QuarterlyRevenue
Group by [crm bp id]

可以肯定地简化了整个查询,但是其余的在逻辑上没有任何问题。将所有东西放在一起:

With QuarterlyRevenue as
     (
         SELECT a.[crm bp id], 
                ISNULL(h.rev, 0) AS revenue, 
                a.qtr, 
                h.qtr_flag,
                CASE
                    WHEN a.qtr IN('Q120')
                         AND ISNULL(h.rev, 0) <> 0
                    THEN 1
                    ELSE 0
                END AS 'Q_0_Flag',
                CASE
                    WHEN a.qtr IN('Q419')
                         AND ISNULL(h.rev, 0) <> 0
                    THEN 1
                    ELSE 0
                END AS 'Q_1_Flag'
         FROM Accounts AS A
              LEFT JOIN
         (
             SELECT crm_bp_id, 
                    ISNULL(SUM(net_revenue), 0) AS rev, 
                    [Cal].[Qtr_Flag], 
                    cal.lqyy
             FROM Historical Revenue AS h
                  LEFT JOIN Calendar AS cal ON cal.cdate = h.inv_date
             WHERE cal.qtr_flag IN('1', '2', '3')
                  AND [Business_Group] <> 'DCG'
             GROUP BY h.crm_bp_id, 
                      cal.qtr_flag, 
                      cal.lqyy
             UNION ALL
             SELECT a.crm_bp_id, 
                   ISNULL(SUM(net_revenue), 0) AS rev, 
                   [Cal].[Qtr_Flag], 
                   cal.lqyy
            FROM Actual Revenue AS a
                 LEFT JOIN Calendar AS cal ON cal.cdate = a.inv_date
            GROUP BY crm_bp_id, 
                     [Cal].[Qtr_Flag], 
                     cal.lqyy
        ) AS h ON h.crm_bp_id = A.[crm bp id]
                  AND h.lqyy = a.qtr
    )
SELECT
            [crm bp id], 
            LastYearRevenue = sum(revenue), 
        PR_Flag = CASE (SUM(Q_0_Flag) > 0) OR (SUM(Q_1_Flag) > 0) THEN 'Active' ELSE 'Lost' END
From QuarterlyRevenue
Group by [crm bp id]