T SQL Pivot每个数据透柱列仍然有一行

时间:2017-03-22 19:51:23

标签: sql-server sql-server-2008

我正在尝试在SQL 2008R2中创建一个数据透视表。我试图在SQL中重现和访问Pivot表。当我运行以下脚本时,我为每个数据透视列获取一条记录,而不是一条带有两个已填充的透视列的记录。

SELECT * FROM
(SELECT DataView.MAEID
, DataView.MoYr
, DataView.ChemicalName
, TblCategories.CatDesc
, DataView.[CAS#]
, DataView.HAP
, Sum([SpecAE]/2000) AS [Total SpecAE Tons]
, SUM([SpecAE]) AS [SpecAE]
FROM TblCategories 
INNER JOIN DataView 
ON TblCategories.CatID = DataView.Category
GROUP BY DataView.MAEID
, DataView.MoYr
, DataView.ChemicalName
, DataView.[CAS#]
, DataView.HAP
, TblCategories.CatDesc) TBL
PIVOT (
 Sum([SpecAE])
 FOR CatDesc IN ([INCIINERABLE LIQUIDS], [Supplemental Fuels])
)pvt

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您尚未提供样本数据,因此我将通过示例解释您的问题。让我们说我有一个非常简单的表,其中包含一些非常简单的值:

DECLARE @T TABLE
(
    MainColumn INT NOT NULL,
    PivotColumn INT NOT NULL,
    SumColumn INT NOT NULL
);

INSERT @T VALUES
(1, 1, 10), (1, 1, 20), (1, 1, 30),
(1, 2, 60),
(1, 3, 50),
(2, 1, 10), (2, 1, 15),
(2, 2, 20),
(3, 1, 10),
(3, 2, 10),
(4, 1, 150);

如果我执行以下查询:

SELECT MainColumn,
       PivotColumn,
       PivotValue = SUM(SumColumn),
       OtherSum = SUM(SumColumn / 5)
FROM @T
GROUP BY MainColumn, PivotColumn
ORDER BY MainColumn, PivotColumn

我明白了:

+------------+-------------+------------+----------+
| MainColumn | PivotColumn | PivotValue | OtherSum |
+------------+-------------+------------+----------+
|          1 |           1 |         60 |       12 |
|          1 |           2 |         60 |       12 |
|          1 |           3 |         50 |       10 |
|          2 |           1 |         25 |        5 |
|          2 |           2 |         20 |        4 |
|          3 |           1 |         10 |        2 |
|          3 |           2 |         10 |        2 |
|          4 |           1 |        150 |       30 |
+------------+-------------+------------+----------+

现在,如果我使用PIVOT为每个PivotColumn旋转PivotValue,它将按MainColumn AND OtherSum列进行分组。 每个不属于数据透视 的列的透视组。

所以我的结果集将分为(MainColumn = 1,OtherSum = 12),(MainColumn = 1,OtherSum = 10),(MainColumn = 2,OtherSum = 5),(MainColumn = 2,OtherSum = 4)等等...我将为每个值获得一个新行。如果OtherSum值对于每一行都是唯一的,那么我期望8行带有一个支点。

如果我从结果集中删除了OtherSum,我的结果集将仅由 MainColumn 分组,因此它对于每个不同的MainColumn值都在一行上,因为它& #39;是枢轴分组的唯一列。

如果获得其他总和值很重要,我可以执行以下操作:

SELECT P.MainColumn,
       Val1A = P.[1],
       Val1B = P.[1] / 5,
       Val2A = P.[2],
       Val2B = P.[2] / 5,
       Val3A = P.[3],
       Val3B = P.[3] / 5
FROM
(
    SELECT MainColumn,
           PivotColumn,
           PivotValue = SUM(SumColumn)
    FROM @T
    GROUP BY MainColumn, PivotColumn
) AS T
PIVOT
(
    SUM(PivotValue) FOR PivotColumn IN ([1], [2], [3])
) AS P;