如何将多组Intensity统计SQL查询结果合并为单表多列?
解答
错误原因
UNION ALL的作用是合并多行结果,要求所有子查询返回的列数、列名、数据类型完全一致。你的三个子查询分别只返回Minute+Intensity1、Minute+Intensity2、Minute+Intensity3,合并后外层查询找不到Intensity2和Intensity3这两个列,因此报错。
正确方案:条件聚合
不需要拆分三个查询,直接用CASE WHEN在聚合时过滤指定强度值,一次性生成三列:
SELECT EXTRACT(TIME FROM Activity_Minute) AS Minute, -- 统计Intensity=1的总和 SUM(CASE WHEN Intensity = 1 THEN Intensity ELSE 0 END) AS Intensity1, -- 统计Intensity=2的总和 SUM(CASE WHEN Intensity = 2 THEN Intensity ELSE 0 END) AS Intensity2, -- 统计Intensity=3的总和 SUM(CASE WHEN Intensity = 3 THEN Intensity ELSE 0 END) AS Intensity3 FROM `bellabeat-case-study-385200.fitbit_data.minute_intensities_narrow` GROUP BY Minute ORDER BY Minute;
结果验证
针对示例数据,执行后会得到如下结果:
| Minute | Intensity1 | Intensity2 | Intensity3 |
|---|---|---|---|
| 00:01:00 | 1 | 2 | 3 |
| 00:02:00 | 2 | 0 | 3 |
补充说明
如果你的需求是统计该强度出现的次数(而非强度值的总和),可以把CASE里的Intensity换成1:
SUM(CASE WHEN Intensity = 1 THEN 1 ELSE 0 END) AS Intensity1_Count
内容的提问来源于stack exchange,提问作者Michael Schlegel
相关产品推荐
相关产品推荐

