在 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)
。
我知道有人问过这个问题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)
。