SQL中的数据透视表

时间:2014-03-09 07:07:23

标签: sql sql-server sql-server-2008 pivot pivot-table

我对sql很新,我有一个SQL查询,如下所示

 SELECT     ColumnTitle AS Months,
                      (SELECT     CellContent
                        FROM          Workflow_CustomFormColumnsData AS CD
                        WHERE      (CustomFormColumnId = CC.Id) AND (RowNumber = 1)) AS Planned,
                      (SELECT     SUM(CAST(CellContent AS INT)) AS Expr1
                        FROM          Workflow_CustomFormColumnsData AS CD
                        WHERE      (CustomFormColumnId IN
                                                   (SELECT     Id
                                                     FROM          Workflow_CustomFormColumns AS FAKE
                                                     WHERE      (Id <= CC.Id) AND (CustomFormId = @CustomForm) AND (ColumnNumber <> 1))) AND (RowNumber = 1)) AS SUMPlanned,
                      (SELECT     CellContent
                        FROM          Workflow_CustomFormColumnsData AS CD
                        WHERE      (CustomFormColumnId = CC.Id) AND (RowNumber = 2)) AS Actual,
                      (SELECT     SUM(CAST(CellContent AS INT)) AS Expr1
                        FROM          Workflow_CustomFormColumnsData AS CD
                        WHERE      (CustomFormColumnId IN
                                                   (SELECT     Id
                                                     FROM          Workflow_CustomFormColumns AS FAKE
                                                     WHERE      (Id <= CC.Id) AND     (CustomFormId = @CustomForm) AND (ColumnNumber <> 1))) AND (RowNumber = 2)) AS SUMActual
  FROM         Workflow_CustomFormColumns AS CC
   WHERE     (CustomFormId = @CustomForm) AND (ColumnNumber <> 1)

    The above code returns values as in the following manner.
    Months Planned SumPlanned Actual SumActual
      Jan     0        0          50      50
     Feb     10       10         25      75  
      Mar     15       25         10      85 

现在我需要在现有查询中添加一个数据透视表来转换输出,如下所示

                Jan  Feb  March
    Planned     0     10   15
    SumPlanned  0     10   25
    Actual      50    25   10
    SumActual   50    75    85

谢谢!

1 个答案:

答案 0 :(得分:0)

尝试此查询:

;with
table1 as
(SELECT     ColumnTitle AS Months,
                  (SELECT     CellContent
                    FROM          Workflow_CustomFormColumnsData AS CD
                    WHERE      (CustomFormColumnId = CC.Id) AND (RowNumber = 1)) AS Planned,
                  (SELECT     SUM(CAST(CellContent AS INT)) AS Expr1
                    FROM          Workflow_CustomFormColumnsData AS CD
                    WHERE      (CustomFormColumnId IN
                                               (SELECT     Id
                                                 FROM          Workflow_CustomFormColumns AS FAKE
                                                 WHERE      (Id <= CC.Id) AND (CustomFormId = @CustomForm) AND (ColumnNumber <> 1))) AND (RowNumber = 1)) AS SUMPlanned,
                  (SELECT     CellContent
                    FROM          Workflow_CustomFormColumnsData AS CD
                    WHERE      (CustomFormColumnId = CC.Id) AND (RowNumber = 2)) AS Actual,
                  (SELECT     SUM(CAST(CellContent AS INT)) AS Expr1
                    FROM          Workflow_CustomFormColumnsData AS CD
                    WHERE      (CustomFormColumnId IN
                                               (SELECT     Id
                                                 FROM          Workflow_CustomFormColumns AS FAKE
                                                 WHERE      (Id <= CC.Id) AND     (CustomFormId = @CustomForm) AND (ColumnNumber <> 1))) AND (RowNumber = 2)) AS SUMActual
  FROM         Workflow_CustomFormColumns AS CC
  WHERE     (CustomFormId = @CustomForm) AND (ColumnNumber <> 1)),
tab1 as
(SELECT 'Planned' col,Jan,Feb,Mar
FROM 
   (SELECT Months,Planned
   FROM table1) p
PIVOT
   (MAX(Planned)
   FOR Months IN 
      (Jan,Feb,Mar)
)AS pvt),
tab2 as
(SELECT 'SumPlanned' col,Jan,Feb,Mar
FROM 
   (SELECT Months,SumPlanned--,Actual,SumActual
   FROM table1) p
PIVOT
   (MAX(SumPlanned)
   FOR Months IN 
      (Jan,Feb,Mar)
)AS pvt),
tab3 as
(SELECT 'Actual' col,Jan,Feb,Mar
FROM 
   (SELECT Months,Actual--,SumActual
   FROM table1) p
PIVOT
   (MAX(Actual)
   FOR Months IN 
      (Jan,Feb,Mar)
)AS pvt),
tab4 as
(SELECT 'SumActual' col,Jan,Feb,Mar
FROM 
   (SELECT Months,SumActual
   FROM table1) p
PIVOT
   (MAX(SumActual)
   FOR Months IN 
      (Jan,Feb,Mar)
)AS pvt)

select * from tab1
union all
select * from tab2
union all
select * from tab3
union all
select * from tab4;

SQL Fiddle