在 T-SQL 中应用 PIVOT 以获取行到列

Applying PIVOT in T-SQL to get rows to column

我知道有人问过这个问题earlier,但我似乎无法应用解决方案来满足我的要求

我需要一个应用 PIVOT,这样 Table(从连接生成):

    Category    |   Tag     |   Title
    ----------------------------------
    First       |   Tag 1   |   Article 1
    Second      |   Tag 2   |   Article 1
    Third       |   Tag 4   |   Article 1
    First       |   Tag 1   |   Article 2
    Second      |   Tag 4   |   Article 2
    Third       |   Tag 5   |   Article 2
    First       |   Tag 1   |   Article 5
    Third       |   Tag 7   |   Article 5
    First       |   Tag 8   |   Article 7

变成:

    Title       |   First   |   Second  |   Third
    ---------------------------------------------
    Article 1   |   Tag 1   |   Tag 2   |   Tag 4
    Article 2   |   Tag 1   |   Tag 4   |   Tag 5
    Article 5   |   Tag 1   |   NULL    |   Tag 7
    Article 7   |   Tag 8   |   NULL    |   NULL    

这是我的查询:

    declare
        @cols nvarchar(max),
        @stmt nvarchar(max)

    select @cols = isnull(@cols + ', ', '') + '[' + T.CategoryTypeTitle + ']' from (select  CategoryTypeTitle from CategoryTypes) as T

    Select @stmt = '
    select Distinct * from
    (
        Select  
        C.CategoryTypeTitle, 
        A.* from Articles A 
        Join
        ArticleToTags AT on AT.ArticleID = A.ArticleID
        Join
        Tags T on T.CategoryID = AT.CategoryID
        Join
        CategoryTypes C on C.CategoryTypeID = T.CategoryTypeID
    ) src
    PIVOT
    (
        Count(Title) --**I need Tag Names (i.e. "Tag 1, Tag 2") instead of getting count or max etc**
        for [CategoryTypeTitle] in ('+ @cols +')
    ) as piv
    '
    Exec sp_executesql @stmt = @stmt

您成功地将我认为是您的实际问题的问题深埋在您的代码示例中。问题似乎是您只想获取一个字符串值,而您发现的大多数样本都使用 COUNT()AVG().

好吧,您总是必须使用聚合。所以你需要的是一个可以处理字符串的聚合。幸运的是,MIN()MAX() 可以,如果只给它们一个值作为输入,那将是整个输出。

所以只需使用 MAX(Title) 而不是 Count(Title)