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

SQL使用Pivot生成动态列:如何按日期而非站点ID实现数据透视

以下是SQL Server环境下的动态透视实现代码,可按照日期自动生成动态列,适配你提到的最多5个不同日期的场景:

-- 1. 定义变量存储动态拼接的列名、动态SQL语句
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)

-- 2. 提取去重的日期,拼接为透视需要的[日期值]格式,此处可根据需求调整日期格式,比如转成yyyy-MM-dd的日期类型
SELECT @cols = STUFF((
    SELECT DISTINCT ',' + QUOTENAME(CONVERT(DATE, CreatedDate)) 
    -- 如果你需要保留完整时间作为列名,替换上面一行为:
    -- SELECT DISTINCT ',' + QUOTENAME(CreatedDate)
    FROM (
        SELECT d.CreatedDate
        FROM DWCorp.SSMaster m 
        INNER JOIN DWCorp.SSDetail d ON d.MasterId = m.Id 
        WHERE ActionId = 7
    ) AS t
    ORDER BY ',' + QUOTENAME(CONVERT(DATE, CreatedDate)) -- 按日期排序列顺序
    FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

-- 3. 拼接完整的动态透视查询语句
SET @query = '
SELECT ProjectNum, siteid, ' + @cols + '
FROM (
    SELECT 
        CONVERT(DATE, d.CreatedDate) AS CreatedDate, -- 和前面的日期格式保持一致
        -- 保留完整时间则改为:d.CreatedDate AS CreatedDate
        m.siteid,
        m.ProjectNum
    FROM DWCorp.SSMaster m 
    INNER JOIN DWCorp.SSDetail d ON d.MasterId = m.Id 
    WHERE ActionId = 7
) AS Sourcetable
PIVOT (
    COUNT(CreatedDate) -- 聚合函数可根据你的业务需求调整,这里统计每个项目+站点在对应日期的记录数
    FOR CreatedDate IN (' + @cols + ')
) AS pivottable 
ORDER BY siteid, ProjectNum'

-- 4. 执行动态SQL
EXEC sp_executesql @query
  • 代码中的聚合函数可以根据你的实际业务调整,如果需要取最大/最小日期替换COUNT(CreatedDate)为MAX(CreatedDate)或者MIN(CreatedDate)即可。
  • 如果希望列名显示为「日期1」「日期2」而非具体日期值,可以调整列名拼接逻辑,按日期排序后拼接别名即可。

内容的提问来源于stack exchange,提问作者Jeremy Reynolds

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:06:03