从 CTE 使用 count + group by 时返回 0 值

问题描述 投票:0回答:1

我有一张这样的桌子:

客户 ID 流失标签 流失分数
2988-QRAJY 是的 10
2919-HBCJO 没有 40

churn_label = 'Yes' 表示客户流失。

churn_label = 'No' 表示客户没有流失。

我正在尝试将 churn_score 分组为 1-30、31-50 等列。我为此使用了 case 语句。创建组并将其放入列后,我想将其放入 CTE 中并从中查询,同时按组对客户的流失计数进行分组,因此它看起来像这样:

churn_score_group 流失计数
10-30 950
31-50 1450

但是,某些组不会有任何流失的客户,换句话说,计数列将为 NULL,因此计数函数不会返回这些行。

我想返回没有任何客户流失的组的行,并返回 0 值。我读到您可以使用 LEFT JOIN 来做到这一点,但我不确定这是否可以通过 self JOIN 实现。我正在使用 WHERE 条件来筛选 churn_label = 'Yes' 的客户。

WITH churn_score_groups AS
(
SELECT 
Customer_id,
Churn_value,
CASE
        WHEN churn_score BETWEEN 1 AND 30 THEN '1-30'
        WHEN churn_score BETWEEN 31 AND 50 THEN '31-60'
        WHEN churn_score BETWEEN 51 AND 80 THEN '51-80'
        WHEN churn_score BETWEEN 81 AND 100 THEN '81-100'
        END AS churn_score_group
FROM churn_status
)
SELECT 
churn_score_group,
COUNT(*) as count
FROM churn_score_groups
WHERE churn_value = 1
GROUP BY churn_score_group;

到目前为止我明白 count 不能返回空值。我不知道如何将它们返回为 0。

谢谢。

sql sql-server
1个回答
0
投票

您可以在

VALUES
源中定义流失组名称和范围,并将其
LEFT JOIN
添加到您的数据中。

SELECT churn_score_group, COUNT(CS.churn_score) as count
FROM  (
    VALUES
        ('1-30', 1, 30),
        ('31-60', 31, 60),
        ('51-80', 51, 80),
        ('81-100', 81, 100)
) CG(churn_score_group, Low, High)
LEFT JOIN churn_status CS
    ON CS.churn_score BETWEEN CG.Low AND CG.High
GROUP BY churn_score_group;

请注意,

COUNT()
函数引用左连接表中的列,以便仅计算匹配的行。

示例结果(对于值 10、20、30、40、50 和 100):

churn_score_group
1-30 3
31-60 2
51-80 0
81-100 1

请参阅 this db<>fiddle 进行演示。

© www.soinside.com 2019 - 2024. All rights reserved.