2015-02-12 25 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