2015-02-12 77 views
0

我想要一些幫助旋轉。我在SQL的數據集,看起來像這樣在SQL中旋轉

ID-----------VisitDate----------Metric------Value 
1001---------2012-01-01---------Cajun-------40 
1001---------2012-01-02---------Cajun-------30 
1001---------2012-01-01---------Ham---------20 
1003---------2012-01-02---------Ham---------10 
1003---------2012-01-03---------Beef--------10 

我怎樣才能讓我基於ID和VisitDate列改造它從長到寬幅轉動這個數據集,因此數據集都將是這個樣子:

ID-----------VisitDate----------Cajun------Ham--------Beef 
1001---------2012-01-01---------40---------20---------Null 
1001---------2012-01-02---------30---------Null-------Null 
1003---------2012-01-02---------Null-------10---------Null 
1003---------2012-01-03---------Null-------Null-------10 
+1

你知道'Value'前期的所有可能的值? – 2015-02-12 05:11:00

+0

種,這只是一個樣本數據庫,真正的數據表大概是3M行。值列只是隨機數值。衆所周知的是度量類型 – sunny 2015-02-12 05:56:11

回答

3

如果您確信的Metric只會由印第安,火腿和牛肉的價值,那麼這將做到這一點:

SELECT 
    Id, 
    VisitDate, 
    Cajun = MAX(CASE WHEN Metric = 'Cajun' THEN Value END), 
    Ham = MAX(CASE WHEN Metric = 'Ham' THEN Value END), 
    Beef = MAX(CASE WHEN Metric = 'Beef' THEN Value END) 
FROM YourTable 
GROUP BY ID, VisitDate 
ORDER BY ID, VisitDate 

在另一方面,如果喲你不知道Metric的價值,那麼你可以使用動態交叉表。供參考:http://www.sqlservercentral.com/articles/Crosstab/65048/

DECLARE @sql1 VARCHAR(4000) = '' 
DECLARE @sql2 VARCHAR(4000) = '' 
DECLARE @sql3 VARCHAR(4000) = '' 

SELECT @sql1 = 
'SELECT 
    ID 
    ,VisitDate' 
+ CHAR(10) 

SELECT @sql2 = @sql2 + 
' ,MAX(CASE WHEN Metric = ''' + Metric + ''' THEN Value END) AS [' + Metric + ']' + CHAR(10) 
FROM(
    SELECT DISTINCT Metric FROM YourTable 
)t 

SELECT @sql3 = 
'FROM YourTable 
GROUP BY ID, VisitDate 
ORDER BY ID, VisitDate 
' 
PRINT(@sql1 + @sql2 + @sql3) 
EXEC (@sql1 + @sql2 + @sql3) 

結果

ID   VisitDate Beef  Cajun  Ham 
----------- ---------- ----------- ----------- ----------- 
1001  2012-01-01 NULL  40   20 
1001  2012-01-02 NULL  30   NULL 
1003  2012-01-02 NULL  NULL  10 
1003  2012-01-03 10   NULL  NULL 
-1

使用PIVOT得到的結果。檢查結果在Fiddler

Ref。學習SQL SERVER – PIVOT and UNPIVOT Table Examples

SELECT id, 
     visitdate, 
     SUM([Cajun]) AS [Cajun], 
     SUM([Ham]) AS [Ham], 
     SUM([beef]) AS [beef] 
FROM Test AS A 
PIVOT(MIN(A.value) FOR A.metric IN ([Cajun],[Ham],[beef])) AS B 
GROUP BY id, visitdate 
0

這裏有一個鏈接到sqlfiddle: http://sqlfiddle.com/#!3/0445e/1

這是它看起來像使用PIVOT:

SELECT 
    ID, 
    VisitDate, 
    Cajun, 
    Ham, 
    Beef 
FROM ( 
    SELECT 
    ID, 
    VisitDate, 
    Metric, 
    Value 
    FROM 
    Bleh 
) AS SourceTable PIVOT (
    MAX (Value) FOR Metric IN (Cajun, Ham, Beef) 
) AS PivotTable