如何在单条SQL中让同一列值被多个CASE条件重复统计?
解决方案
你可以通过交叉连接(CROSS JOIN)配合VALUES子句实现同一行数据对应多个统计分类的需求,无需嵌套查询、CTE或自连接,具体SQL如下:
SELECT report_month, starts_category, SUM(num_orders) AS total_orders FROM your_table_name CROSS JOIN (VALUES ('Gross Starts'), ('Net Starts') ) AS categories(starts_category) WHERE (starts_category = 'Gross Starts' AND payment_disposition IN ('Free Trial', 'Pre-paid')) OR (starts_category = 'Net Starts' AND payment_disposition IN ('Payup', 'Pre-paid')) GROUP BY report_month, starts_category;
原理说明
VALUES ('Gross Starts'), ('Net Starts')生成包含两个统计分类的临时数据集CROSS JOIN将原表每一行与两个分类各匹配一次,把符合多分类条件的行复制为对应数量的条目WHERE子句过滤每个分类对应的有效payment_disposition类型:- 分类为
Gross Starts时,仅保留Free Trial和Pre-paid的行 - 分类为
Net Starts时,仅保留Payup和Pre-paid的行
- 分类为
- 最后按
report_month和starts_category分组求和,即可让Pre-paid同时被统计到两个分类中
这种方式不会像自连接那样导致数据量指数级增长,每个原始行最多生成2条数据,性能可控。
内容的提问来源于stack exchange,提问作者nofxsi210
相关产品推荐
相关产品推荐

