2012-08-31 24 views
16

好吧,我有一個看起來像這樣T-SQL的動態支點

ItemID | ColumnName | Value 
1  | name  | Peter 
1  | phone  | 12345678 
1  | email  | [email protected] 
2  | name  | John 
2  | phone  | 87654321 
2  | email  | [email protected] 
3  | name  | Sarah 
3  | phone  | 55667788 
3  | email  | [email protected] 

表現在我需要把它轉換成這樣:

ItemID | name | phone | email 
1  | Peter | 12345678 | [email protected] 
2  | John | 87654321 | [email protected] 
3  | Sarah | 55667788 | [email protected] 

我一直在看動態樞紐的例子,但似乎我無法將它們融入我的場景中。

任何人都可以幫忙嗎?

+0

我沒有看到一個支點在您的數據。您已經在第一個塊中以奇怪的方式列出了常規列名和值,通常在第二個塊中列出。 – IamIC

+0

如果第一個塊表示您的實際數據,那麼爲什麼它像這樣存儲,而不是歸一化? – IamIC

+0

爲什麼您需要這種數據的動態PIVOT?這可以通過靜態PIVOT來實現(查看我的答案)。是否因爲您希望ColumnName具有名稱,電話和電子郵件以外的值? – Kash

回答

26

看一看下面的例子

CREATE TABLE #Table (
     ID INT, 
     ColumnName VARCHAR(250), 
     Value VARCHAR(250) 
) 

INSERT INTO #Table SELECT 1,'name','Peter' 
INSERT INTO #Table SELECT 1,'phone','12345678' 
INSERT INTO #Table SELECT 1,'email','[email protected]' 
INSERT INTO #Table SELECT 2,'name','John' 
INSERT INTO #Table SELECT 2,'phone','87654321' 
INSERT INTO #Table SELECT 2,'email','[email protected]' 
INSERT INTO #Table SELECT 3,'name','Sarah' 
INSERT INTO #Table SELECT 3,'phone','55667788' 
INSERT INTO #Table SELECT 3,'email','[email protected]' 

---I assumed your tablename as TESTTABLE--- 
DECLARE @cols NVARCHAR(2000) 
DECLARE @query NVARCHAR(4000) 

SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT 
           '],[' + t.ColumnName 
         FROM #Table AS t 
         --ORDER BY '],[' + t.ID 
         FOR XML PATH('') 
        ), 1, 2, '') + ']' 

SELECT @cols 

SET @query = N'SELECT ID,'+ @cols +' FROM 
(SELECT t1.ID,t1.ColumnName , t1.Value FROM #Table AS t1) p 
PIVOT (MAX([Value]) FOR ColumnName IN ('+ @cols +')) 
AS pvt;' 

EXECUTE(@query) 

DROP TABLE #Table 
+0

非常感謝,那正是我一直在尋找的! –

+0

很棒! :) –

-1

下面是我用我的contactlist :)查詢

SELECT * 
FROM 
    (
    SELECT Contact_Id AS CT 
      , [Age] 
      , [Sex] 
      , [State] 
      , [Country] 
      , [Keyword] 
      , [Married] 
      , [Kids] 
      , [Car] 
    FROM 
     (SELECT c.PropertyName 
       , c.ValueString 
       , c.Contact_Id 
      FROM 
       ContactProfiles c) AS ctp 
     PIVOT (max(ctp.ValueString) FOR PropertyName IN ([Age], [Sex], [State], [Country], [Keyword], [Married], [Kids], [Car])) AS PivotTable 
     ) AS pvt 

WHERE 
    pvt.[Age] > 18 
    AND (pvt.[State] = 'CA' OR pvt.[State] = 'NY') 
    AND pvt.[Sex] = 'F' 
    --*AND pvt.[Keyword] LIKE '%B;%' 
    AND pvt.[Married] = 'True' 
    AND pvt.[Kids] > 0 
0

你不需要動態支點,監守這將是一個不同的表格。簡單地做這樣的事情:

name phone email 
--------------------------------- 
Peter    
     123456 
       [email protected] 

入住這SQL fiddle

SELECT DISTINCT u.ItemID, n.Value as 'name', p.Value as 'phone', e.Value as 'email' 
FROM UserData u 
INNER JOIN(
SELECT ItemID, Value 
FROM UserData WHERE ColumnName = 'name') n ON n.ItemID = u.ItemID 
INNER JOIN(
SELECT ItemID, Value 
FROM UserData WHERE ColumnName = 'phone') p ON p.ItemID = u.ItemID 
INNER JOIN(
SELECT ItemID, Value 
FROM UserData WHERE ColumnName = 'email') e ON e.ItemID = u.ItemID 
+2

問題是ColumnNames是動態的。他們的名字和列數都會有所不同。 –

3

試試這個:

的SQL Server 2005+

;with 
     cte_name as(select * from <table> where ColumnName='name'), 
     cte_phone as(select * from <table> where ColumnName='phone'), 
     cte_email as(select * from <table> where ColumnName='email') 
    select n.ItemID,n.Value [Name],p.Value [Phone],e.Value [Email] 
    from cte_name n 
    join cte_phone p 
    on n.ItemID=p.ItemID 
    join cte_email e 
    on n.ItemID=e.ItemID 


SQL Fiddle Demo

-1

你有沒有嘗試過這樣的:

SELECT ItemID, name, phone, email 
FROM 
(SELECT [ItemID] ,[ColumnName] ,[Value] FROM Item) Item 
PIVOT (MAX(Value) FOR ColumnName IN (name, phone, email)) as pvt 
+2

問題是ColumnNames是動態的。他們的名字和列數都會有所不同。 –