SQL数据转换:如何基于Type列创建新列并合并重复行?
行转列并合并Day+Region分组记录的解决方案
你的问题核心是单独使用CASE WHEN时没有对同组记录做聚合,导致每个分组内只有对应Type的行有值,其他行都是NULL。只要把CASE WHEN和聚合函数结合,再按Day、Region分组,就能消除空值并合并记录。
核心SQL写法
SELECT Day, Region, SUM(CASE WHEN Type = 'States' THEN Amount END) AS States, SUM(CASE WHEN Type = 'Cities' THEN Amount END) AS Cities, SUM(CASE WHEN Type = 'Regions' THEN Amount END) AS Regions FROM your_table_name GROUP BY Day, Region;
写法解释
- 聚合函数(SUM/MAX):因为每个Day+Region+Type组合只有一条记录,用
SUM或MAX都能提取到对应Type的Amount值,同时自动忽略其他Type对应的NULL值,避免结果中出现空值(除非该分组下某Type完全没有记录,这时候会返回NULL,可按需处理)。 - GROUP BY子句:按Day和Region分组,确保每个唯一的Day+Region组合只生成一行结果。
处理空值(可选)
如果希望把无对应Type记录的NULL替换为默认值(比如0),可以用COALESCE函数包裹聚合表达式:
SELECT Day, Region, COALESCE(SUM(CASE WHEN Type = 'States' THEN Amount END), 0) AS States, COALESCE(SUM(CASE WHEN Type = 'Cities' THEN Amount END), 0) AS Cities, COALESCE(SUM(CASE WHEN Type = 'Regions' THEN Amount END), 0) AS Regions FROM your_table_name GROUP BY Day, Region;
示例效果
假设原始数据:
| Day | Region | Type | Amount |
|---|---|---|---|
| 2024-01-01 | North | States | 100 |
| 2024-01-01 | North | Cities | 200 |
| 2024-01-01 | North | Regions | 300 |
| 2024-01-02 | South | States | 150 |
执行第一个SQL后得到:
| Day | Region | States | Cities | Regions |
|---|---|---|---|---|
| 2024-01-01 | North | 100 | 200 | 300 |
| 2024-01-02 | South | 150 | NULL | NULL |
执行带COALESCE的SQL后得到:
| Day | Region | States | Cities | Regions |
|---|---|---|---|---|
| 2024-01-01 | North | 100 | 200 | 300 |
| 2024-01-02 | South | 150 | 0 | 0 |
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

