PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

क्रॉसस्टैब क्वेरी अनुरोध को स्थानांतरित करता है

विशेष कठिनाई यह है कि आपका डेटा क्रॉस टेबुलेशन के लिए तैयार नहीं है। आपको 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-पैरामीटर फॉर्म की आवश्यकता है )।

अगर आपके पास बहुत सारे हैं मेट्रिक्स कॉलम में, हो सकता है कि आप क्वेरी स्ट्रिंग को गतिशील रूप से बनाना चाहें। संबंधित:

यह भी ध्यान दें कि आगामी Postgres 9.5 (वर्तमान में बीटा) एक समर्पित ROLLUP के लिए SQL क्लॉज .
संबंधित:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. प्रति समूह पहली और अंतिम पंक्ति से मान प्राप्त करें

  2. एसक्यूएल:चयन करने के लिए वृद्धिशील आईडी के साथ कॉलम जोड़ें

  3. कैसे पाप () PostgreSQL में काम करता है

  4. डेटाटेबल्स - जेसन आउटपुट - पोस्टग्रेएसक्यूएल - रिटर्न शून्य

  5. PostgreSQL 9.2.1 . में लूपिंग ट्रिगर कॉल से कैसे बचें