【问题标题】:SQL Unpivoting dataSQL 反透视数据
【发布时间】:2022-11-12 12:18:12
【问题描述】:

我正在尝试将我每几 KB 完成的列值 (Month_End) 旋转,但随后我还需要将其他列 (PAC_Contract、PAC_Projected_Cost、JTD_Actual) 还原为行值,但我感到困惑并且不确定 PIVOT 是否正确攻击这个。

SQL 2012

这是表

这就是我想要达到的

这是我目前所在的地方,但它似乎是风景优美的路线:)

DECLARE @columns NVARCHAR(MAX) = '',
        @sql     NVARCHAR(MAX) = '';

-- Get the last 3 Month End Dates
SELECT TOP 3
    @columns += QUOTENAME(Month_End) + ','

FROM _rec_spectrum_CTC_Master
GROUP BY Month_End
ORDER BY Month_End desc;

-- Remove the last comma
SET @columns = LEFT(@columns, LEN(@columns) - 1);

PRINT @columns;

-- Construct the PIVOT
SET @sql ='
    SELECT * FROM(
        SELECT
        Job_Number,
        Month_End,
        ''PAC Contract'' AS Column_Name,
        PAC_Contract AS Value
    FROM _rec_spectrum_CTC_Master WHERE Job_Number = ''A1327''
    UNION
    SELECT
      Job_Number,
      Month_End,
    ''PAC Projected Cost'' AS Column_Name,
    PAC_Projected_Cost AS Value
    FROM _rec_spectrum_CTC_Master WHERE Job_Number = ''A1327''
    UNION
    SELECT
      Job_Number,
      Month_End,
      ''JTD_Actual_Cost'' AS Column_Name,
      JTD_Actual_Cost AS Value
    FROM _rec_spectrum_CTC_Master WHERE Job_Number = ''A1327''
    ) d
    PIVOT(
        SUM(Value)
        FOR Month_End IN ('+ @columns +')
    ) AS ppc ;';

EXECUTE sp_executesql @sql

【问题讨论】:

    标签: sql sql-server pivot unpivot


    【解决方案1】:

    您通常会将列取消旋转到行,然后将日期旋转到新列:

    select x.col
        max(case when month_end = '2022-06-01' then val end) as val_06_01,
        max(case when month_end = '2022-07-01' then val end) as val_07_01,
        max(case when month_end = '2022-08-01' then val end) as val_08_01
    from mytable t
    cross apply ( values 
        ('PAC_Contract', t.pac_contract), 
        ('PAC_PROJECTED_COST', t.pac_projected_cost), 
        ('JTD_Actual_Cost', t.jtd_actual_cost) 
    ) x(col, val)
    group by x.col
    

    请注意,这仅适用于初始列和日期的固定列表;如果您想要比这更灵活的东西,那么您需要动态 SQL。

    【讨论】:

    • 我希望它是动态的。当我每个月运行报告时,我想退回过去 3 个月。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 2021-06-10
    相关资源
    最近更新 更多