2013-08-11 5 views
5

ऐसा लगता है कि यह एक सामान्य आवश्यकता होनी चाहिए, लेकिन मुझे यह नहीं पता कि टी-एसक्यूएल पिवॉट फ़ंक्शन का उपयोग करके इसे कैसे किया जाए। विशेष रूप से, मैं एक पिवॉट कॉलम मान पर कॉलम के लिए AVG और STDEV की गणना करना चाहता हूं। डेटा कुछ इस तरह दिखाई (छोड़े गए डेटा के बहुत सारे हैं, लेकिन यह दिल के लिए हो जाता है):उसी कॉलम पर एकाधिक योग वाले टी-एसक्यूएल पिवट

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

मैं निम्नलिखित उत्पादन

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

मैं पुराने पर वापस लौटने की जरूरत है देखना चाहेंगे केस स्टेटमेंट तर्क?

धन्यवाद!

+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 में लेकिन टीएसक्यूएल नहीं है।

0

आप दो pivots बनाने के लिए और शामिल होने के लिए उन्हें

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

यह 'केस' का उपयोग करने से बहुत कम कुशल है क्योंकि आप समूहिंग और एकत्रीकरण को दो बार करते हैं (साथ ही अतिरिक्त अतिरिक्त जोड़ना) –

+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 
[एसक्यूएल सर्वर धुरी - एकाधिक समुच्चय] की
संबंधित मुद्दे