2014-06-24 162 views
0

我有台公制数据动态生成列

Metric ID   Metric Date    Metric Result  Metric Calculation Color 
-------------------------------------------------------------------------------------- 
001    2004-04-01     1     GREEN 
002    2004-04-01     0     RED 
001    2004-05-01     1     GREEN 
002    2004-05-01     5     YELLOW 
003    2004-05-01     2     GREEN 

我想结果集类似

Metric ID  April Result   April Calc Color May Result May Calc Color 
--------------------------------------------------------------------------------------- 
001    1      GREEN    1   RED 
002    0      RED     5   YELLOW 
003               2   GREEN 

我已经使用的数据透视表的概念,但它给我的重复的结果就像

Metric ID  April Result   April Calc Color May Result May Calc Color 
--------------------------------------------------------------------------------------- 
001    1      GREEN    NULL  NULL 
001    NULL     NULL     1   RED 
002    0      RED     NULL  NULL 
002    NULL     NULL     5   YELLOW 
003               2   GREEN 

这是我用

查询
;With CTE AS 
( 
SELECT * FROM (SELECT C.METRIC_ID,RESULT,COLOR FROM METRICDATA) Q PIVOT (MAX(RESULT) FOR [RESULT] IN ([April],[May]))Pv) PIVOT (MAX(COLOR) FOR [RESULT] IN ([April],[May]))Pv1) 

度量结果和计算颜色列应根据查询提供的日期限制生成。

在此先感谢。

+0

;随着CTE AS( SELECT * FROM ( SELECT C.METRIC_ID,RESULT,COLOR FROM METRICDATA )问 PIVOT (MAX(RESULT) FOR [结果] IN([年4月] ,[日]) )PV )PIVOT (MAX(彩色) FOR [结果] IN([月],[日]) )在Pv1 ) – Amirtha

+0

如果你能得到这一结果你为什么不只是最后一次聚合它?像SELECT Metric_ID,MAX(April_Result)AS April_Result,MAX(April_Calc_Color)AS April_Calc_Color,MAX(May_Result)AS May_Result,MAX(May_Calc_Color)AS May_Calc_Color FROM MyPivot GROUP BY Metric_ID – VBlades

+0

我不知道确切的月份范围它应该作为参数传递如果我正在使用聚合,它将在结果集中单独采用最新月份的值,并将NULL作为所有其他月份的值返回。 – Amirtha

回答

0

试试这个,而不是旋转

Select metricId, 
Case when datepart(Metric_Date)=4 then Metric_Result else o end 'April Result', 
Case when datepart(Metric_Date)=4 then Metric_Color else NULL end 'April Calc Color', 
Case when datepart(Metric_Date)=5 then Metric_Result else o end 'MayResult', 
Case when datepart(Metric_Date)=5 then Metric_Color else NULL end 'May Calc Color' 
from Metric 
0

这很有趣。 SQLFiddle不喜欢我的代码(我似乎不太喜欢变量),但这在我的本地盒子上工作。这里的模式来测试:

CREATE TABLE METRICDATA 
    ([Metric_ID] varchar(3), [Date] date, [Result] int, [Color] varchar(6)) 
; 

INSERT INTO METRICDATA 
    ([Metric_ID], [Date], [Result], [Color]) 
VALUES 
    ('001', '2004-04-01', 1, 'GREEN'), 
    ('002', '2004-04-01', 0, 'RED'), 
    ('001', '2004-05-01', 1, 'GREEN'), 
    ('002', '2004-05-01', 5, 'YELLOW'), 
    ('003', '2004-05-01', 2, 'GREEN') 
; 

而这里的代码:

DECLARE @StartDate AS DATE, 
     @EndDate AS DATE, 
     @SQL VARCHAR(MAX); 

SET @StartDate = '20040401'; 
SET @EndDate = '20040501'; 

WITH cteWithMonths 
AS 
(
    SELECT  Metric_ID, 
       DATENAME(MONTH, Date) AS MonthName, 
       DATEPART(M, Date) AS Month, 
       MAX(DATEPART(M, Date)) OVER() AS MaxMonth, 
       Color 
    FROM 
       METRICDATA 
    WHERE 
       Date BETWEEN @StartDate AND @EndDate 
    GROUP BY 
       Metric_ID, 
       DATENAME(MONTH, Date), 
       DATEPART(M, Date), 
       Color 
), 
cteSQLFieldList 
AS 
(
    SELECT  0 AS LineNum, 'SELECT DISTINCT m.Metric_ID,' AS SQL 
    UNION ALL 
    SELECT  DISTINCT 
       MONTH, 
       CASE 
        WHEN Month < MaxMonth THEN MonthName + '.' + MonthName + '_Result, ' + MonthName + '.' + MonthName + '_Calc_Color,' 
        ELSE MonthName + '.' + MonthName + '_Result, ' + MonthName + '.' + MonthName + '_Calc_Color' 
       END 
    FROM  cteWithMonths 
    UNION ALL 
    SELECT  13, 
       'FROM METRICDATA m' 
), 
cteSQLJoinList 
AS 
(
    SELECT  DISTINCT 
       MONTH + 13 AS LineNum, 
       'LEFT JOIN (SELECT Metric_ID, SUM(RESULT) AS ' + MonthName + '_Result, Color AS ' + MonthName + '_Calc_Color FROM METRICDATA WHERE DATENAME(MONTH, Date) = ''' + MonthName + ''' GROUP BY Metric_ID, Color) ' + MonthName +' ON m.Metric_ID = ' + MonthName + '.Metric_ID' AS SQL 
    FROM  cteWithMonths 
), 
cteSQLOrderByList 
AS 
(
    SELECT  26 AS LineNum, 
       'ORDER BY m.Metric_ID' AS SQL 
), 
cteSQL_ALL 
AS 
(
    SELECT  * 
    FROM  cteSQLFieldList 
    UNION 
    SELECT  * 
    FROM  cteSQLJoinList 
    UNION 
    SELECT  * 
    FROM  cteSQLOrderByList 
) 

SELECT  @SQL = COALESCE(@SQL + ' ', '') + SQL 
FROM  cteSQL_ALL 
ORDER BY LineNum; 

EXEC(@SQL); 

我不想跟你PIVOT解决方案发挥,要诚实。动态构建它看起来很复杂。我选择了聚合每个Metric_ID在dervied表然后加入所有他们在一起。我生成必要的动态SQL然后执行它。