SQL如何将ID与年份表行转列,按年份匹配情况填充1或0
行转列需求解决方案
你要实现的是固定列的行转宽表需求,使用条件聚合即可实现,该方案兼容所有主流SQL数据库:
SELECT id, MAX(CASE WHEN year = 2002 THEN 1 ELSE 0 END) AS `2002`, MAX(CASE WHEN year = 2006 THEN 1 ELSE 0 END) AS `2006`, MAX(CASE WHEN year = 2010 THEN 1 ELSE 0 END) AS `2010`, MAX(CASE WHEN year = 2014 THEN 1 ELSE 0 END) AS `2014`, MAX(CASE WHEN year = 2018 THEN 1 ELSE 0 END) AS `2018` FROM year_sheet GROUP BY id ORDER BY id;
逻辑说明
- 内层
CASE判断每行的年份是否匹配对应列,匹配返回1,否则返回0 - 外层用
MAX做分组聚合:同一个id下只要有任意一条记录匹配该年份,聚合结果就是1,否则返回0,完全符合你的取值要求
如果你使用的数据库支持PIVOT语法(如Oracle、SQL Server、Spark SQL等),可以用更简洁的写法:
SELECT * FROM year_sheet PIVOT ( COUNT(year) FOR year IN (2002, 2006, 2010, 2014, 2018) ) AS pivot_result ORDER BY id;
两种方案输出的结果完全一致,对应你的示例数据输出如下:
| id | 2002 | 2006 | 2010 | 2014 | 2018 |
|---|---|---|---|---|---|
| 101 | 1 | 1 | 1 | 1 | 1 |
| 102 | 1 | 1 | 1 | 1 | 0 |
| 103 | 0 | 0 | 1 | 0 | 0 |
内容的提问来源于stack exchange,提问作者ConcreteJungle
相关产品推荐
相关产品推荐

