2017-10-06 14 views
0

SQL ServerのPIVOT関数で複数の集計を使用しようとしています。現在、私は期待どおりに動作しているSUMを使用していますが、私はAVGをSUMと一緒に使用したかったのです。いくつかのサンプルクエリを見ましたが、長すぎます。誰でも下のクエリを修正して、各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

私は、元のソースデータに、毎回基づいて、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)PIVOTPIVOTの最初の部分で述べた列を「使い切った」ことです。これは、最初のPIVOTの後に、2番目のピボットを直接適用できるようにする年を含む列がないことを意味します。

+0

あなたは素晴らしいです。どうもありがとうございます。私の場合は、集計された列が5つ以上ありますが、ロジックはまだ簡単です。 – user1396423