आपके उदाहरण के लिए मूल क्रॉसस्टैब क्वेरी सरल है:
SELECT * FROM crosstab(
'SELECT zoom, day, point
FROM province
ORDER BY 1, 2'
, $$VALUES ('2015-10-01'::date), ('2015-10-02')$$)
AS ct (zoom text, day1 int, day2 int);
लेकिन नहीं गतिशील स्तंभ नामों या स्तंभों की एक गतिशील संख्या के साथ। एक समझौता के रूप में, आपके पास स्तंभों की एक निश्चित संख्या हो सकती है और केवल प्रमुख कॉलम भर सकते हैं। मूल बातें:
- PostgreSQL क्रॉसस्टैब क्वेरी
गतिशील?
crosstab_hash
गतिशील कॉलम नामों में आपकी सहायता नहीं करेगा। यह कॉलम परिभाषा सूची टाइप किए बिना बार-बार उपयोग के लिए है, लेकिन गतिशील . के लिए नहीं स्तंभ नाम। उदाहरण:
- PostgreSQL में क्रॉसस्टैब के लिए गतिशील रूप से कॉलम जेनरेट करें
- एसक्यूएल:पंक्तियों को स्तंभों में बदलना
वास्तव में गतिशील स्तंभ नामों के लिए, आपको दो . की आवश्यकता है सर्वर के लिए राउंड ट्रिप। चाहे आप दूसरी क्वेरी बनाने के लिए पहली क्वेरी के साथ कॉलम नाम पुनर्प्राप्त करें, या आप कर्सर या अस्थायी तालिका या तैयार कथन बनाएं। आप जो भी कोशिश करें, आपको दो राउंड ट्रिप की जरूरत है। SQL कॉल के समय रिटर्न प्रकार जानना चाहता है।
मेरे कस्टम crosstab_n()
. के साथ मैं "डायनेमिक" कॉल के सबसे करीब पहुंच सकता हूं इस संबंधित उत्तर में परिभाषित फ़ंक्शन:
- केस और ग्रुप बाय के साथ पिवट का डायनामिक विकल्प
या आप पूरी तरह से गतिशील क्रॉसस्टैब क्वेरी का विचार छोड़ देते हैं (क्योंकि, आप जानते हैं, यह असंभव है) और दो-चरणीय वर्कफ़्लो का उपयोग करें, जैसा कि ऊपर बताया गया है।
-
फ़ंक्शन को क्रॉसस्टैब क्वेरी टेक्स्ट जेनरेट करने दें। आप यहां दिए गए फ़ंक्शन का उपयोग कर सकते हैं (और इसे अपनी आवश्यकताओं के अनुसार अनुकूलित कर सकते हैं!):
- डायनेमिक क्रॉसस्टैब क्वेरी निष्पादित करें
<उप>विशेष रूप से,
GROUP BY 1, 2
को हटा दें , चूंकि आप क्रॉस टेबुलेशन से पहले पंक्तियों को एकत्रित नहीं करते हैं। -
जनरेट किए गए फ़ंक्शन को निष्पादित करें।
पूर्णता के लिए, नया \crosstabview
. भी है पोस्टग्रेज में psql में मेटाकमांड 9.6 (अभी जारी किया गया) - समान कार्यक्षमता के साथ, और यह गतिशील कॉलम नाम प्रदर्शित कर सकता है (डायनामिक नाम संलग्न करना psql क्लाइंट में होता है, पोस्टग्रेज सर्वर में नहीं)।