2013-08-11 5 views
5

これは一般的な必要があるようですが、T-SQL PIVOT機能を使用してこれを行う方法はわかりません。具体的には、AVGとSTDEVをPivot列値を超える列に対して計算したいとします。データは、この(省略データの多くが、これは心に届く)のようなものを見て:私は次の出力同じ列に複数の集計を含むT-SQLピボット

-------------------------------------------------------------------------- 
NonPivotCol1 NonPivotCol2 2001_Mean 2001_Avg 2002_Mean 2002_Avg Etc 
-------------------------------------------------------------------------- 
Some Value Some Value  32   5.2  28   3.1 
Etc. 
-------------------------------------------------------------------------- 

を見たい

-------------------------------------------------------------------------- 
ID   Year  PersonID  Score 
-------------------------------------------------------------------------- 
106   2001  1   20 
107   2002  1   30  
108   2003  1   40  
109   2004  1   50  
106   2002  2   20 
107   2003  2   50  
108   2004  2   30  
109   2005  2   10 
-------------------------------------------------------------------------- 

を私は昔に戻す必要がありますかCASE文ロジック?

ありがとうございます!

+0

可能複製(http://stackoverflow.com/questions/1243567/sql – JeffO

答えて

4

はいを​​見てください参加する必要があります。

旧式のCASE構文を使用してください。

SELECT AVG(CASE WHEN Year = 2001 THEN Score END) AS 2001_Avg, 
     STDEV(CASE WHEN Year = 2001 THEN Score END) AS 2001_StDev /*...*/ 

PIVOTはこれにとってちょうど(汎用性の低い)構文砂糖です。

Oracle supports multiple aggregatesPIVOTですが、TSQLではありません。

0

は、次の2つのピボットを作成し、それら

WITH MinPivot AS 
(
    SELECT 
     [2001] AS [2001_MEAN], 
     [2002] AS [2002_MEAN], 
     [2003] AS [2003_MEAN], 
     [2004] AS [2004_MEAN], 
     [2005] AS [2005_MEAN] 
    FROM 
    (
    SELECT Year,Score 
    FROM Table1 
) As S 
    PIVOT 
    (
    STDEV(Score) 
    FOR Year in([2001],[2002],[2003],[2004],[2005]) 
) 
    AS pvt 
), 
AvgPivot AS 
(
    SELECT 
     [2001] AS [2001_AVG], 
     [2002] AS [2002_AVG], 
     [2003] AS [2003_AVG], 
     [2004] AS [2004_AVG], 
     [2005] AS [2005_AVG] 
    FROM 
    (
    SELECT Year,Score 
    FROM Table1 
) As S 
    PIVOT 
    (
    AVG(Score) 
    FOR Year in([2001],[2002],[2003],[2004],[2005]) 
) 
    AS pvt 
) 

SELECT * 
FROM MinPivot M 
CROSS JOIN AvgPivot A 

this fiddle example

+0

グループ化と集約を2回実行するだけでなく、追加の結合を追加すると、 'CASE'を使用するよりもはるかに効率が悪い –

+0

これはどちらの場合でも代用です。 –

2

ユースケースステートメント。あなたはとにかくすべての列を指定する必要があり、私はその場合は、ピボットよりも使用可能であると言うだろう

select 
    avg(case when [Year] = 2001 then [Score] else null end) as [2001_Avg], 
    avg(case when [Year] = 2002 then [Score] else null end) as [2002_Avg] 
from Table1 
[SQL ServerのPIVOT - 複数の集約]の
関連する問題