2017-10-06 159 views
0

我想在SQL Server中的PIVOT函数中使用多个聚合。目前我已经使用了按预期工作的SUM,我还想和AVG一起使用AVG。我看到一些示例查询,但时间太长。任何人都可以帮助我修改以下查询,以包含每个PaymentMethod和每年的SubTotal的AVG。在SQL Server中的PIVOT函数中的多个聚合

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; 

回答

2

我想不出这样做除了运行基于两个完全独立的PIVOT S,每一次,原始的源数据的任何方式。

所以我搬到子选择成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之后,没有任何包含年份的列允许直接应用第二个数据透视表。

+0

你太棒了。非常感谢。就我而言,我有5个以上的聚合列,但您的逻辑看起来更简单。 – user1396423