我正在尝试与丢失/活动的客户创建标志。我有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
答案 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]