我想我正在尝试做一些无法做到的事情。我正在尝试创建一个数据透视表,同时通过聚合两个不同的列来做两个支点。我已经创建了一个简化的示例,以使这一点更容易理解。
CREATE TABLE two_aggregate_pivot (
ID INT,
category CHAR(1),
value INT
)
INSERT INTO dbo.two_aggregate_pivot
( ID, category, value )
VALUES (1, 'A', 100),
(1, 'B', 97),
(1, 'D', NULL),
(2, 'A', 86),
(2, 'C', 83),
(2, 'D', 81)
我可以转动以获得类别的计数,如下所示:
SELECT piv1.ID,
[A] AS cat_A,
[B] AS cat_B,
[C] AS cat_C,
[D] AS cat_D
FROM
(SELECT ID, category FROM dbo.two_aggregate_pivot) SRC
PIVOT
(
COUNT(category)
FOR category IN ([A],[B],[C],[D])
) piv1
我得到了我想要的东西。
ID cat_A cat_B cat_C cat_D
1 1 1 0 1
2 1 0 1 1
我也可以编写一个完全独立的查询,在源选择中添加值列,然后从MAX(值)聚合,并获得最大值的轴。
ID val_A val_B val_C val_D
1 100 97 NULL NULL
2 86 NULL 83 81
但我能弄清楚的是如何让他们两个都得到。
ID cat_A cat_B cat_C cat_D val_A val_B val_C val_D
1 1 1 0 1 100 97 NULL NULL
2 1 0 1 1 86 NULL 83 81
我在stackoverflow上看过这样的示例,使用CASE语句来检查IS NOT NULL,但这对我来说不起作用我不会想,因为我可以同时拥有缺失值和现存值空值。我可以创建两个CTE,每个PIVOT一个,然后加入它们。这给了我想要的表,但它强制对表进行两次聚簇索引扫描,然后是连接运算符。该表非常大,性能很重要,因此我想尝试在同一聚簇索引扫描中找到一种方法来完成两个枢轴。
这甚至可能吗?
答案 0 :(得分:1)
也许十字架申请取消您的数据。我应该补充一点,动态是一件小事。
示例强>
Select *
From (
Select ID
,B.*
From two_aggregate_pivot A
Cross Apply (values ('cat_'+category ,1)
,('val_'+category ,value)
) B (Item,Value)
) src
Pivot (sum(value) for item in ([cat_A],[cat_B],[cat_C],[cat_D],[val_A],[val_B],[val_C],[val_D]) ) pvt
<强>返回强>
ID cat_A cat_B cat_C cat_D val_A val_B val_C val_D
1 1 1 NULL 1 100 97 NULL NULL
2 1 NULL 1 1 86 NULL 83 81