【问题标题】:pivoting on a column without knowing the entire list of values在不知道整个值列表的情况下旋转一列
【发布时间】:2010-03-11 00:24:37
【问题描述】:

我有一张桌子

Title            Name             Type
------------------------------------------------
T1               A                Primary
T1               B                Primary
T2               B                Primary
T2               C                Secondary
T2               D                Secondary

我需要输出是

Title            Primary          Secondary
------------------------------------------------
T1               A, B             NULL/Blank
T2               B                C, D

原始表中的[Name] 列可以有任何值。即稍后可能会有 E、F、G 等。

如何做到这一点?

【问题讨论】:

    标签: sql-server sql-server-2005 tsql sql-server-2008


    【解决方案1】:

    那么你需要动态 SQL。考虑这样的事情来生成列列表:

    DECLARE @collist nvarchar(max);
    SELECT @collist = STUFF((SELECT ', ' + quotename(Type) FROM YourTable GROUP BY Type FOR XML PATH('')), 1, 2, '');
    

    现在您可以使用@collist 来帮助构建您想要的查询,然后您可以使用sp_executesql 运行它

    像这样:

    DECLARE @collist nvarchar(max);
    SELECT @collist = STUFF((SELECT ', ' + quotename(Type) FROM YourTable GROUP BY Type FOR XML PATH('')), 1, 2, '');
    
    DECLARE @qry nvarchar(max);
    SET @qry = N'
    SELECT Title, ' + @collist + '
    FROM 
    (
        SELECT t.Title, t.Type, (SELECT STUFF((SELECT '', ''  + t2.Name FROM YourTable t2 WHERE t2.Title = t.Title AND t2.Type = t.Type ORDER BY t2.Name FOR XML PATH('''')),1,2,'''')) AS Names
        FROM YourTable t
        GROUP BY t.Type, t.Title
    ) tg
    pivot (max(Names) for tg.Type in (' + @collist + ')) p
    ';
    exec sp_executesql @qry;
    

    【讨论】:

    • 我刚刚开始了解 PIVOT。我确实运行了查询,它给我的输出为 [Primary]、[Primary]、[Primary]、[Secondary]、[Secondary]。但是如何将 PIVOT 应用于所需的输出?
    • 如果我能提供帮助,请发布完整的输出。
    • @Will:我评论中的输出是运行 Rob Farley 回答中提到的@collist 后完成的输出。问题中提到的所需输出是所需的完整输出。希望这可以澄清。
    • @stackoverflowuser:对不起,我以为你在问如何使用 PIVOT 来获得 DESIRED 输出。我的错! =)
    猜你喜欢
    • 1970-01-01
    • 2016-11-10
    • 2018-11-16
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 2020-02-18
    • 1970-01-01
    相关资源
    最近更新 更多