如何编写SQL查询并排展示会员与临时用户的统计数量
解决SQL中两类用户数量并排统计的问题
问题分析
你第二个查询的统计结果相同,核心原因是COUNT函数的特性:COUNT会统计所有非NULL值,当member_casual = "member"不成立时,这个表达式返回FALSE(而非NULL),所以COUNT会把每一行都计入统计,最终两个COUNT结果都是表的总行数,和实际分类数量不符。
第一个查询用UNION ALL会把两个结果上下拼接,得到两行数据,自然无法实现并排展示的需求。
正确写法
方法1:使用SUM + CASE WHEN(通用所有SQL方言)
SELECT SUM(CASE WHEN member_casual = 'member' THEN 1 ELSE 0 END) AS member_count, SUM(CASE WHEN member_casual = 'casual' THEN 1 ELSE 0 END) AS casual_count FROM `ascendant-yeti-415121.cyclistic_capstone_data.divvy_data_2023`
原理:CASE WHEN会对每一行判断,满足条件返回1,否则返回0,SUM累加后就是对应类别的用户总数。
方法2:简化SUM写法(适用于BigQuery等支持布尔值转数值的方言)
因为你的数据表是BigQuery格式,BigQuery会把布尔值TRUE转成1,FALSE转成0,所以可以直接写:
SELECT SUM(member_casual = 'member') AS member_count, SUM(member_casual = 'casual') AS casual_count FROM `ascendant-yeti-415121.cyclistic_capstone_data.divvy_data_2023`
补充:分组转置写法(可选)
也可以先通过GROUP BY得到分组统计,再用PIVOT转成列(BigQuery支持):
SELECT * FROM ( SELECT member_casual FROM `ascendant-yeti-415121.cyclistic_capstone_data.divvy_data_2023` ) PIVOT ( COUNT(*) FOR member_casual IN ('member' AS member_count, 'casual' AS casual_count) )
内容的提问来源于stack exchange,提问作者Baxter Stockman
相关产品推荐
相关产品推荐

