我正在尝试在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;
答案 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
之后,不再有任何列包含年份以允许直接应用第二个数据透视。