使用没有连接的聚合创建数据透视表

时间:2017-10-11 15:57:26

标签: sql-server pivot aggregate

我想我正在尝试做一些无法做到的事情。我正在尝试创建一个数据透视表,同时通过聚合两个不同的列来做两个支点。我已经创建了一个简化的示例,以使这一点更容易理解。

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一个,然后加入它们。这给了我想要的表,但它强制对表进行两次聚簇索引扫描,然后是连接运算符。该表非常大,性能很重要,因此我想尝试在同一聚簇索引扫描中找到一种方法来完成两个枢轴。

这甚至可能吗?

1 个答案:

答案 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