एक बार फिर, केवल कुछ "डेटा प्रकारों" से अधिक के लिए, मैं crosstab()
. का उपयोग करने का सुझाव देता हूं :
SELECT * FROM crosstab(
$$SELECT DISTINCT ON (1, 2)
'max' AS "type", data_type, val
FROM tbl
ORDER BY 1, 2, val DESC$$
,$$VALUES ('Final Fantasy'), ('Quake 3'), ('World of Warcraft')$$)
AS x ("type" text, "Final Fantasy" int, "Quake 3" int, "World of Warcraft" int)
रिटर्न:
type | Final Fantasy | Quake 3 | World of Warcraft
-----+---------------+---------+-------------------
max | 500 | 1500 | 1200
बुनियादी बातों के लिए अधिक स्पष्टीकरण:
PostgreSQL क्रॉसस्टैब क्वेरी
गतिशील समाधान
मुश्किल काम है इसे पूरी तरह से गतिशील . बनाना :इसे काम करने के लिए
- एक अज्ञात नंबर स्तंभों का (इस मामले में data_types)
- अज्ञात नामों के साथ (data_types फिर से)
कम से कम प्रकार सर्वविदित है:integer
इस मामले में।
संक्षेप में:वर्तमान PostgreSQL (9.3 सहित) के साथ यह संभव नहीं है। बहुरूपी प्रकारों के साथ सन्निकटन हैं और सरणियों या hstore प्रकारों के साथ प्रतिबंधों को दरकिनार करने के तरीके हैं। आपके लिए काफी अच्छा हो सकता है। लेकिन यह सख्ती से संभव नहीं है एकल SQL क्वेरी में अलग-अलग कॉलम के साथ परिणाम प्राप्त करने के लिए। SQL प्रकारों के बारे में बहुत कठोर है और जानना चाहता है कि क्या वापस आने की उम्मीद है।
हालांकि , यह दो . के साथ किया जा सकता है प्रश्न। पहला उपयोग करने के लिए वास्तविक क्वेरी बनाता है। उपरोक्त साधारण मामले पर निर्माण:
SELECT $f$SELECT * FROM crosstab(
$$SELECT DISTINCT ON (1, 2)
'max' AS "type", data_type, val
FROM tbl
ORDER BY 1, 2, val DESC$$
,$$VALUES ($f$ || string_agg(quote_literal(data_type), '), (') || $f$)$$)
AS x ("type" text, $f$ || string_agg(quote_ident(data_type), ' int, ') || ' int)'
FROM (SELECT DISTINCT data_type FROM tbl) x
यह वह क्वेरी उत्पन्न करता है जिसकी आपको वास्तव में आवश्यकता है। दूसरे को उसी लेन-देन के अंदर चलाएँ समवर्ती मुद्दों से बचने के लिए।
quote_literal()
. के रणनीतिक उपयोग पर ध्यान दें और quote_ident()
सभी प्रकार के अवैध (स्तंभों के लिए) नामों को साफ करने और एसक्यूएल इंजेक्शन . को रोकने के लिए ।
डॉलर-उद्धरण की कई परतों से भ्रमित न हों। गतिशील प्रश्नों के निर्माण के लिए यह आवश्यक है। मैंने इसे यथासंभव सरल रखा है।