विशेष कठिनाई यह है कि आपका डेटा क्रॉस टेबुलेशन के लिए तैयार नहीं है। आपको row_name . रूप में डेटा चाहिए , श्रेणी , मान . आप इसे UNION
. के साथ प्राप्त कर सकते हैं क्वेरी:
SELECT 'metric1' AS metric, country_code, metric1 FROM tbl1
UNION ALL
SELECT 'metric2' AS metric, country_code, metric2 FROM tbl1
UNION ALL
SELECT 'metric3' AS metric, country_code, metric3 FROM tbl1
ORDER BY 1, 2 DESC;
लेकिन एक स्मार्ट LATERAL
क्वेरी को केवल एक टेबल स्कैन की आवश्यकता है और यह तेज़ होगी:
SELECT x.metric, t.country_code, x.val
FROM tbl1 t
, LATERAL (VALUES
('metric1', metric1)
, ('metric2', metric2)
, ('metric3', metric3)
) x(metric, val)
ORDER BY 1, 2 DESC;
संबंधित:
crosstab()
. के सरल रूप का उपयोग करना इनपुट के रूप में इस क्वेरी के साथ 1 पैरामीटर के साथ:
SELECT * FROM crosstab(
$$SELECT x.metric, t.country_code, x.val
FROM tbl1 t
, LATERAL (VALUES
('metric1', metric1)
, ('metric2', metric2)
, ('metric3', metric3)
) x(metric, val)
ORDER BY 1, 2 DESC$$
)
AS ct (metric text, us int, uk int, fr int);
देश के नामों को वर्णानुक्रम में अवरोही क्रम में सूचीबद्ध करें (जैसे आपके डेमो में)। यह भी मानता है कि सभी मीट्रिक परिभाषित हैं NOT NULL
।
यदि एक या दोनों मामला नहीं है, तो इसके बजाय 2-पैरामीटर फ़ॉर्म का उपयोग करें:
"रोलअप" जोड़ें
अर्थात। प्रति मीट्रिक योग:
SELECT * FROM crosstab(
$$SELECT x.metric, t.country_code, x.val
FROM (
TABLE tbl1
UNION ALL
SELECT 'zzz_total', sum(metric1)::int, sum(metric2)::int, sum(metric3)::int -- etc.
FROM tbl1
) t
, LATERAL (VALUES
('metric1', metric1)
, ('metric2', metric2)
, ('metric3', metric3)
) x(metric, val)
ORDER BY 1, 2 DESC$$
)
AS ct (metric text, total int, us int, uk int, fr int);
'zzz_total'
एक मनमाना लेबल है, जिसे अंतिम वर्णानुक्रम में क्रमबद्ध करना चाहिए (या आपको crosstab()
के 2-पैरामीटर फॉर्म की आवश्यकता है )।
अगर आपके पास बहुत सारे हैं मेट्रिक्स कॉलम में, हो सकता है कि आप क्वेरी स्ट्रिंग को गतिशील रूप से बनाना चाहें। संबंधित:
- कॉलमों को सूचीबद्ध किए बिना, प्रत्येक कॉलम पर समान एकत्रीकरण कैसे करें?
- PL/ में गतिशील रूप से क्वेरी निष्पादित करना pgSQL
यह भी ध्यान दें कि आगामी Postgres 9.5 (वर्तमान में बीटा) एक समर्पित ROLLUP
के लिए SQL क्लॉज
.
संबंधित: