简体   繁体   English

通过CASE表达式计算客户Lost vs Active

[英]Count customers Lost vs Active through CASE expression

I am trying to create flag with customers lost/active. 我正在尝试与失去/活跃的客户一起创建旗帜。 I have 4 quarters and if they did not buy in last two quarters (0, 1) I consider them lost. 我有4个季度,如果他们在过去的两个季度(0,1)没有买,我认为他们输了。 But I want to apply the flag for the whole ID despite they had revenue in remaining two quarters (2,3). 但我想在整个身份证上使用旗帜,尽管他们在剩下的两个季度(2,3)有收入。 Now is showing me lost for 0, 1 but active for 2, 3 in case there was revenue. 现在显示我输掉​​了0,1,但是在有收入的情况下活动为2,3。

I know my case when condition is wrong and is showing results based on I written there but do not know how to figure it out. 我知道我的情况,当条件错误,并根据我写在那里显示结果,但不知道如何弄明白。

What I have tried: 我尝试过的:

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' 

Full Code 完整代码

  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

What I get 我得到了什么

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

What I Want 我想要的是

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

Based on your comment that you don't need to see the Quarterly data, your final statement could be along the lines of: 根据您的评论,您不需要查看季度数据,您的最终陈述可能是:

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]

The entirety of your query could certainly be simplified, but there isn't anything logically wrong with the rest. 你的整个查询当然可以简化,但其余部分没有任何逻辑错误。 Putting everything together you have: 把所有东西放在一起你有:

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]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM