SQL Server

时间:2017-10-06 09:09:04

标签: sql-server pivot

我正在尝试在SQL Server的PIVOT函数中使用多个聚合。目前我已经使用了按预期工作的SUM,我也希望将AVG与SUM一起使用。我看到了一些示例查询,但它们太长了。任何人都可以帮我修改以下查询,以便为每个PaymentMethod和每年包含SubTotal的AVG。

    SELECT PaymentMethod, [2016], [2015]
FROM (SELECT PaymentMethod, SubTotal, YEAR(OrderDate) AS [YEAR]
      FROM [TransactionDetails]) AS sq 
PIVOT(SUM(SubTotal) FOR [YEAR] 
IN([2016], [2015])) AS Pvt;

1 个答案:

答案 0 :(得分:2)

除了在原始源数据上每次运行两个完全独立的PIVOT之外,我无法想到这样做。

所以我已经将子选择转移到CTE中以避免重复其定义,然后我加入了PaymentMethod上的两个透视结果:

declare @t table (PaymentMethod varchar(30) not null, SubTotal int not null, 
                  OrderDate date not null)
insert into @t(PaymentMethod,SubTotal,OrderDate) values
('Cash',10,'20150101'), ('Cash',20,'20151231'),
('Cash',30,'20160101'), ('Cash',90,'20161231')

;With ToBePivoted as (
    SELECT PaymentMethod, SubTotal, YEAR(OrderDate) AS [YEAR]
    FROM @t
)
SELECT s.PaymentMethod, s.[2016],a.[2016], s.[2015], a.[2015]
FROM
    ToBePivoted tbp1
    PIVOT(SUM(SubTotal) FOR [YEAR] IN([2016], [2015])) AS s
    inner join
    ToBePivoted tbp2
    pivot(AVG(SubTotal) FOR [YEAR] IN([2016],[2015])) AS a
    ON
        s.PaymentMethod = a.PaymentMethod

结果:

PaymentMethod                  2016        2016        2015        2015
------------------------------ ----------- ----------- ----------- -----------
Cash                           120         60          30          15

这里的问题是:a)我们想要使用不同的聚合(在一个PIVOT中不允许)和b)PIVOT“用完”第一部分中提到的列PIVOT。这意味着在第一个PIVOT之后,不再有任何列包含年份以允许直接应用第二个数据透视。