繁体   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