एक नाम और मूल्य के साथ अपरिभाषित पंक्ति गणना के साथ दो तालिकाओं को देखते हुए , मैं CROSS JOIN
उनके मूल्यों पर एक फ़ंक्शन का पिवोट कैसे प्रदर्शित करूंगा ।
CREATE TEMP TABLE foo AS
SELECT x::text AS name, x::int
FROM generate_series(1,10) AS t(x);
CREATE TEMP TABLE bar AS
SELECT x::text AS name, x::int
FROM generate_series(1,5) AS t(x);
उदाहरण के लिए, यदि वह फ़ंक्शन गुणन था, तो मैं नीचे की तरह एक (गुणा) तालिका कैसे उत्पन्न करूंगा,
उन सभी (arg1,arg2,result)
पंक्तियों के साथ उत्पन्न किया जा सकता है
SELECT foo.name AS arg1, bar.name AS arg2, foo.x*bar.x AS result
FROM foo
CROSS JOIN bar;
तो यह केवल प्रस्तुतिकरण का सवाल है, मैं चाहूंगा कि यह भी एक कस्टम नाम के साथ काम करे - एक ऐसा नाम जो केवल CAST
टेक्स्ट के लिए तर्क एड नहीं है, लेकिन तालिका में सेट किया गया है;
CREATE TEMP TABLE foo AS
SELECT chr(x+64) AS name, x::int
FROM generate_series(1,10) AS t(x);
CREATE TEMP TABLE bar AS
SELECT chr(x+72) AS name, x::int
FROM generate_series(1,5) AS t(x);
मुझे लगता है कि यह आसानी से एक गतिशील रिटर्न-प्रकार में सक्षम CROSSTAB के साथ सक्षम होगा।
SELECT * FROM crosstab(
'
SELECT foo.x AS arg1, bar.x AS arg2, foo.x*bar.x
FROM foo
CROSS JOIN bar
', 'SELECT DISTINCT name FROM bar'
) AS **MAGIC**
लेकिन, बिना **MAGIC**
मुझे मिलता है
ERROR: a column definition list is required for functions returning "record" LINE 1: SELECT * FROM crosstab(
संदर्भ के लिए, नाम के साथ ऊपर के उदाहरण का उपयोग करते हुए इस तरह क्या कुछ है tablefunc
की crosstab()
आवश्यकताओं।
SELECT * FROM crosstab(
'
SELECT foo.x AS arg1, bar.x AS arg2, foo.x*bar.x
FROM foo
CROSS JOIN bar
'
) AS t(row int, i int, j int, k int, l int, m int);
लेकिन, अब हम bar
अपने उदाहरण में तालिका की सामग्री और आकार के बारे में धारणा बनाने के लिए वापस आ गए हैं । तो अगर,
- टेबल्स अपरिभाषित लंबाई के हैं,
- फिर क्रॉस-ज्वाइन अपरिभाषित आयाम के क्यूब का प्रतिनिधित्व करता है (ऊपर के कारण),
- कैटागिरी-नाम (क्रॉस-टैब पार्लेंस) तालिका में हैं
उस तरह की प्रस्तुति को उत्पन्न करने के लिए "कॉलम परिभाषा सूची" के बिना पोस्टग्रेएसक्यूएल में हम सबसे अच्छा क्या कर सकते हैं?