我正在尝试在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
有什么想法吗?
答案 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;