簡體   English   中英

透視SQL

[英]Pivoting in 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 Columns將其從長格式轉換為寬格式,因此數據集將如下所示:

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 

如果您確定Metric的值僅包含Cajun,Ham和Beef,則可以這樣做:

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

這是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

使用PIVOT獲得結果。 Fiddler中檢查結果

參考 學習SQL SERVER – PIVOT和UNPIVOT表示例

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM