2013-08-11 32 views
5

Điều này có vẻ như nó phải là một nhu cầu chung, nhưng tôi không thấy làm thế nào để làm điều này bằng cách sử dụng chức năng T-SQL PIVOT. Cụ thể, tôi muốn tính toán AVG và STDEV cho một cột trên một giá trị cột Pivot. Các dữ liệu giống như thế này (nhiều dữ liệu bỏ qua, nhưng điều này được cho trung tâm):T-SQL Xoay với nhiều tập hợp trên cùng một cột

-------------------------------------------------------------------------- 
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 
-------------------------------------------------------------------------- 

Tôi muốn nhìn thấy đầu ra sau đây

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

Tôi có cần phải trở lại cái cũ CASE tuyên bố logic?

Cảm ơn!

+0

có thể trùng lặp với [SQL Server PIVOT - Nhiều Tổng hợp] (http://stackoverflow.com/questions/1243567/sql) -Server-pivot-multiple-aggregates) – JeffO

Trả lời

4

Yes.

Chỉ cần sử dụng cú pháp kiểu cũ 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 chỉ là (ít linh hoạt) đường cú pháp cho điều này.

Oracle supports multiple aggregates trong PIVOT nhưng TSQL thì không.

0

Bạn phải làm cho hai trục và tham gia cùng họ

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 

Có một cái nhìn tại this fiddle example

+0

Điều này kém hiệu quả hơn nhiều so với việc chỉ sử dụng 'CASE' khi bạn thực hiện nhóm và tập hợp hai lần (cũng như thêm một sự tham gia bổ sung) –

+0

Đó là một sự thay thế trong mọi trường hợp. –

2

báo cáo ca sử dụng. Bạn phải chỉ định tất cả các cột và tôi cho rằng trường hợp đó có thể sử dụng được nhiều hơn pivot

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 
Các vấn đề liên quan