我有一张这样的桌子:
客户 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。
谢谢。
您可以在
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 进行演示。