【问题标题】:dynamic pivot for non aggregate非聚合的动态枢轴
【发布时间】:2016-03-04 17:57:48
【问题描述】:

我知道如何动态旋转显示,例如,here

在我的场景中,动态透视可能不起作用,其中 #source 可以包含动态列和动态列值,必须按照此处所示进行透视:

IF OBJECT_ID('tempdb..#Source') IS NOT NULL DROP TABLE #Source
IF OBJECT_ID('tempdb..#Aim') IS NOT NULL DROP TABLE #Aim

CREATE TABLE #Source
(
    ColumnName NVARCHAR(10),
    ColumnValue NVARCHAR(10),
    Id INT
)

CREATE TABLE #Aim
(
    Id INT,
    Column1 NVARCHAR(10),
    Column2 NVARCHAR(10),
    Column3 NVARCHAR(10)
)

INSERT INTO #Source (ColumnName, ColumnValue, Id) VALUES ('Column1', 'Value1', 1);
INSERT INTO #Source (ColumnName, ColumnValue, Id) VALUES ('Column2', 'Value1', 1);
INSERT INTO #Source (ColumnName, ColumnValue, Id) VALUES ('Column1', 'Value2', 2);
INSERT INTO #Source (ColumnName, ColumnValue, Id) VALUES ('Column1', 'Value4', 3);
INSERT INTO #Source (ColumnName, ColumnValue, Id) VALUES ('Column3', 'Value1', 3);
INSERT INTO #Source (ColumnName, ColumnValue, Id) VALUES ('Column3', 'Value3', 4);

SELECT * FROM #Source

INSERT INTO #Aim (Id, Column1, Column2, Column3) VALUES (1, 'Value1', 'Value1', NULL)
INSERT INTO #Aim (Id, Column1, Column2, Column3) VALUES (2, 'Value2', NULL, NULL)
INSERT INTO #Aim (Id, Column1, Column2, Column3) VALUES (3, 'Value4', NULL, 'Value1')
INSERT INTO #Aim (Id, Column1, Column2, Column3) VALUES (4, NULL, NULL, 'Value3')

SELECT * FROM #Aim 

我正在尝试实现#Aim 的最后一个选择语句的输出。我希望这是不言自明的。这可能吗?

https://www.mssqltips.com/sqlservertip/2783/script-to-create-dynamic-pivot-queries-in-sql-server/

【问题讨论】:

    标签: sql tsql sql-server-2014


    【解决方案1】:

    你可以这样做

    DECLARE @col_list VARCHAR(max) = (SELECT Quotename(ColumnName) + ','
       FROM   #Source
       GROUP  BY ColumnName
       ORDER  BY ColumnName
       FOR xml path('')) -- To create the dynamic column list 
    
    SET @col_list = LEFT(@col_list, Len(@col_list) - 1) -- To remove the leading comma 
    
    DECLARE @sql NVARCHAR(max)
    
    SELECT @sql = 'select * from #Source
    pivot (max(ColumnValue) for ColumnName in ('
                  + @col_list + '))pv'
    
    EXEC Sp_executesql @sql  -- Execute the dynamic sql
    

    结果:

    ╔════╦═════════╦═════════╦═════════╗
    ║ Id ║ Column1 ║ Column2 ║ Column3 ║
    ╠════╬═════════╬═════════╬═════════╣
    ║  1 ║ Value1  ║ Value1  ║ NULL    ║
    ║  2 ║ Value2  ║ NULL    ║ NULL    ║
    ║  3 ║ Value4  ║ NULL    ║ Value1  ║
    ║  4 ║ NULL    ║ NULL    ║ Value3  ║
    ╚════╩═════════╩═════════╩═════════╝
    

    【讨论】:

    • 哇,谢谢。我也尝试使用 max 但没有让它工作。谢谢!
    • 我添加了一个后续问题:stackoverflow.com/questions/35803654/… - 非常感谢任何输入。
    • @csetzkorn - 添加解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2019-04-04
    • 2017-09-10
    • 1970-01-01
    相关资源
    最近更新 更多