2012-10-03 42 views
4

我使用SQL Server 2008的T-SQL PIVOT:一列列名,其餘的重視

我有兩個表

  1. UserUserID, Name, Link
  2. UserNotesNoteID, 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 Fiddle

我想創建視圖(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等),否則使用標題字段作爲列名稱。是否有可能這樣做?乾杯!

回答

1

這是不是一個視圖。這是將返回結果的過程,只要你想

,你可以把它作爲

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 [email protected] 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Title) 
        from [UserNotes] where UserID [email protected] 
      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 
2
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