2011-09-27 16 views
10

में पिवोटिंग कैसे करें मैं PostgreSQL में नया हूं।PostgreSQL

मान लीजिए मैं

colorname Hexa rgb rgbvalue 
Violet #8B00FF r 139 
Violet #8B00FF g 0 
Violet #8B00FF b 255 
Indigo #4B0082 r 75 
Indigo #4B0082 g 0 
Indigo #4B0082 b 130 
Blue #0000FF r 0 
Blue #0000FF g 0 
Blue #0000FF b 255 

नीचे के रूप में एक मेज है, तो मैं के रूप में

SELECT colorname,hexa,[r], [g], [b] 
FROM 
(SELECT colorname,hexa,rgb,rgbvalue 
    FROM tblPivot) AS TableToBePivoted 
PIVOT 
(
sum(rgbvalue) 
FOR rgb IN ([r], [g], [b]) 
) AS PivotedTable; 

एसक्यूएल सर्वर में एक धुरी करना मैं के रूप में

colorname hexa r g b 
Blue #0000FF 0 0 255 
Indigo #4B0082 75 0 130 
Violet #8B00FF 139 0 255 

आउटपुट प्राप्त करने के लिए कैसे PostgreSQL का उपयोग कर वही?

ERROR: function crosstab(unknown) does not exist 
LINE 2: FROM crosstab 
      ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 
********** Error ********** 
ERROR: function crosstab(unknown) does not exist** 

वहाँ PostgreSQL में ऐसा करने से (किसी भी समारोह में बनाया गया ...) क्या की मानक अभ्यास है के किसी भी सुरुचिपूर्ण रास्ता नहीं है:

मेरे प्रयास

SELECT * 
FROM crosstab 
(
    'SELECT 
     colorname 
     ,hexa 
     ,rgb 
     ,rgbvalue 
    FROM tblPivot' 
)AS ct(colorname text, hexa text, rgb text, rgbvalue int); 

लेकिन geting त्रुटि है ऐसा करने से ?

उत्तर

5

यह एक में शामिल हों के रूप में व्यक्त किया जा सकता है:

SELECT c.colorname, c.hexa, r.rgbvalue, g.rgbvalue, b.rgbvalue 
FROM (SELECT colorname, hexa 
     FROM sometable 
     GROUP BY colorname) c 
JOIN sometable r ON c.colorname = r.colorname AND r.rgb = 'r' 
JOIN sometable g ON c.colorname = g.colorname AND g.rgb = 'g' 
JOIN sometable b ON c.colorname = b.colorname AND b.rgb = 'b' 
; 
+0

लेकिन क्यों crosstab काम didnot ... उस में समर्थन नहीं करता वर्तमान संस्करण जिसका मैं उपयोग कर रहा हूं? –

+4

'crosstab()' 'tablefunc' मॉड्यूल से संबंधित है। आपको 'CREATE EXTENSION' का उपयोग करके इसे सक्षम करना होगा। ने कहा कि; यह सुविधा जो महान पेशकश नहीं हो सकती है; postgresql जुड़ने को अनुकूलित करने में शानदार रूप से अच्छा है, और इस तरह का कोड अधिक डेटाबेस और अधिक डेवलपर्स के लिए अधिक पहचान योग्य होगा। – SingleNegationElimination

+0

यदि आप क्रॉसस्टैब सामान का बहुत कुछ करते हैं, तो tablefunc contrib मॉड्यूल बहुत अच्छा हो सकता है। यदि आप उबंटू पर हैं, तो आप इसे करके एक डीबी में tablefunc फ़ंक्शन जोड़ सकते हैं: psql dbname -f /usr/share/postgresql/8.4/contrib/tablefunc.sql या कुछ समान। –

32

भागो इस

CREATE EXTENSION tablefunc; 

और आपकी क्वेरी को निष्पादित करने की कोशिश

+2

यदि मैं इसे चलाता हूं तो मुझे 'त्रुटि: एक्सटेंशन' मिलता है tablefunc "पहले से मौजूद है 'लेकिन जब मैं इसका उपयोग करने का प्रयास करता हूं तो मुझे' त्रुटि मिलती है: फ़ंक्शन क्रॉसस्टैब (अज्ञात) मौजूद नहीं है। मैं मैक 10.9.2 पर पोस्टग्रेस 9.2.1 का उपयोग कर रहा हूं। कोई विचार? – Black

+2

सुनिश्चित करें कि आप अपने डेटाबेस से \ c db_name के साथ जुड़े हुए हैं और फिर उपरोक्त आदेश चलाएं। – sm0ke21

+1

यह [उत्तर] (https://stackoverflow.com/a/23073241/177116) ने @ ब्लैक की टिप्पणी में उठाए गए प्रश्न का उत्तर दिया है। –