MS SQL Server行转列查询:将周度面包食用数据转为宽表
在MS SQL Server中实现行转列(人员面包食用量按天展开)
我来帮你搞定这个需求!把每个人一周7天的面包数据转成一行,包含姓名和每天的食用量列,在MS SQL Server里有两种实用的方法,咱们一步步来:
方法一:使用PIVOT函数
PIVOT是SQL Server专门用来做透视转换的工具,适合这种固定列的行转列场景。假设你的表名叫PersonBread,可以这么写:
SELECT Name, [2] AS MonBread, -- WeekDay=2对应周一 [3] AS TuesBread, -- WeekDay=3对应周二 [4] AS WedBread, -- WeekDay=4对应周三 [5] AS ThuBread, -- WeekDay=5对应周四 [6] AS FriBread, -- WeekDay=6对应周五 [7] AS SatBread, -- WeekDay=7对应周六 [1] AS SunBread -- WeekDay=1对应周日 FROM PersonBread PIVOT ( MAX(Bread) -- 因为每人每天只有一条数据,MAX/SUM都可以 FOR WeekDay IN ([1], [2], [3], [4], [5], [6], [7]) ) AS PivotTable ORDER BY Name;
代码说明:
PIVOT子句里的MAX(Bread):因为每个人员在每个WeekDay下只有一条记录,所以用MAX或者SUM都能正确取出对应的值;如果有重复数据,SUM可以自动求和,按需选择。FOR WeekDay IN (...):指定要转成列的WeekDay值,然后在SELECT里给每个值起对应的别名(MonBread、TuesBread等)。- 最后用
ORDER BY Name可以让结果按姓名排序,更整洁。
方法二:使用条件聚合(CASE WHEN)
如果觉得PIVOT不够灵活,或者需要更自定义的逻辑,条件聚合是个不错的选择,兼容性也更好:
SELECT Name, MAX(CASE WHEN WeekDay = 2 THEN Bread END) AS MonBread, MAX(CASE WHEN WeekDay = 3 THEN Bread END) AS TuesBread, MAX(CASE WHEN WeekDay = 4 THEN Bread END) AS WedBread, MAX(CASE WHEN WeekDay = 5 THEN Bread END) AS ThuBread, MAX(CASE WHEN WeekDay = 6 THEN Bread END) AS FriBread, MAX(CASE WHEN WeekDay = 7 THEN Bread END) AS SatBread, MAX(CASE WHEN WeekDay = 1 THEN Bread END) AS SunBread FROM PersonBread GROUP BY Name ORDER BY Name;
代码说明:
- 每个
CASE WHEN会筛选出对应WeekDay的Bread值,其他日期为NULL,再用MAX聚合去掉NULL,得到该人员对应日期的面包量。 GROUP BY Name确保每个人员只返回一行数据。
两种方法都能实现你的需求,你可以根据自己的习惯和实际场景选择~
内容的提问来源于stack exchange,提问作者SWDeveloper
相关产品推荐
相关产品推荐

