私は、元のソースデータに、毎回基づいて、2つの完全に独立しPIVOT
Sを実行する以外にこれを行うのいずれかの方法を考えることはできません。
だから私はその定義の繰り返しを避けるためにCTEに副選択を移動したし、私は、2つの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
の後に、2番目のピボットを直接適用できるようにする年を含む列がないことを意味します。
あなたは素晴らしいです。どうもありがとうございます。私の場合は、集計された列が5つ以上ありますが、ロジックはまだ簡単です。 – user1396423