[英]T-SQL PIVOT: One row to column name and the other to value
我正在使用SQL Server 2008。
我有兩張桌子
User
( UserID, Name, Link
) UserNotes
( NoteID, UserID, Title, Description
) 這是示例數據結構。
INSERT INTO [User]
([UserID], [Name], [Link])
VALUES
(1, 'John', 'L1'),
(2, 'Steve', 'L234');
INSERT INTO [UserNotes]
([NoteID], [UserID], [Title], [Description])
VALUES
(1, 1, 'AboutJohn', 'This is about john'),
(2, 1, 'John Work', 'This is where John work'),
(3, 1, 'John Education', 'This is the uni where John go'),
(4, 2, 'Steve Note1', 'Des1 about Steve'),
(5, 2, 'Steve Note2', 'Des2 about Steve');
這是SQL小提琴
我想按如下方式創建視圖( User_view
),當我執行此命令時,輸出應如下所示。
SELECT * FROM User_view WHERE UserID IN (1)
UserID Name AboutJOhn JohnWork JohnEducation
1 John This is about john This is where Johnwork This is the uni where John go
子表的Title
列應該成為列名, Description
應該成為該列的值,我們不知道我們將擁有多少行。 當我們選擇兩個用戶以及使用列名稱的名稱時,我知道這個問題。 在這種情況下,我們可以使用(Note1,Note2,Note3等多個用戶),否則使用title字段作為列名。 有可能這樣做嗎? 干杯!
CREATE VIEW User_view
AS
SELECT UserID, Name, [AboutJohn], [John Work], [John Education]
FROM
(
SELECT n.UserID, u.Name, n.Title, n.Description
FROM [User] u JOIN UserNotes n ON u.UserID = n.UserID
WHERE u.UserID IN (1)
) a
PIVOT
(
MAX(Description)
FOR Title IN ([AboutJohn], [John Work], [John Education])
) b
這不是一個視圖..這是一個將根據需要返回結果的過程
你可以稱之為
proc_UserNotes 1
proc_UserNotes 2
等等
CREATE procedure proc_UserNotes (@UserID int)
as
begin
DECLARE @cols AS NVARCHAR(MAX),
@cols_WITH_MAX AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
select @cols_WITH_MAX = STUFF((SELECT distinct ',MAX('
+ QUOTENAME(Title) +') AS ' + QUOTENAME(Title)
from [UserNotes] where UserID =@UserID
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Title)
from [UserNotes] where UserID =@UserID
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT [UserID], '+ @cols_WITH_MAX +' FROM(
SELECT [UserID], ' + @cols + ' from
(
SELECT * FROM
[UserNotes] where UserID ='+cast(@UserID as varchar(20)) +'
)X
pivot
(
MAX([Description])
for [Title] in (' + @cols + ')
) p )a GROUP BY [UserID]'
print(@query)
execute(@query)
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.