You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:35:05