[英]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.