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

PostgreSQL क्रॉसस्टैब क्वेरी

अतिरिक्त मॉड्यूल स्थापित करें tablefunc एक बार प्रति डेटाबेस, जो फ़ंक्शन प्रदान करता है crosstab() . पोस्टग्रेज 9.1 के बाद से आप CREATE EXTENSION . का उपयोग कर सकते हैं उसके लिए:

CREATE EXTENSION IF NOT EXISTS tablefunc;

बेहतर टेस्ट केस

CREATE TABLE tbl (
   section   text
 , status    text
 , ct        integer  -- "count" is a reserved word in standard SQL
);

INSERT INTO tbl VALUES 
  ('A', 'Active', 1), ('A', 'Inactive', 2)
, ('B', 'Active', 4), ('B', 'Inactive', 5)
                    , ('C', 'Inactive', 7);  -- ('C', 'Active') is missing

साधारण रूप - अनुपलब्ध विशेषताओं के लिए उपयुक्त नहीं है

crosstab(text) 1 . के साथ इनपुट पैरामीटर:

SELECT *
FROM   crosstab(
   'SELECT section, status, ct
    FROM   tbl
    ORDER  BY 1,2'  -- needs to be "ORDER BY 1,2" here
   ) AS ct ("Section" text, "Active" int, "Inactive" int);

रिटर्न:

 Section | Active | Inactive
---------+--------+----------
 A       |      1 |        2
 B       |      4 |        5
 C       |      7 |           -- !!
  • कास्टिंग और नाम बदलने की कोई आवश्यकता नहीं है।
  • नोट करें गलत C . के लिए परिणाम :मान 7 पहले कॉलम के लिए भरा जाता है। कभी-कभी, यह व्यवहार वांछनीय होता है, लेकिन इस उपयोग के मामले के लिए नहीं।
  • साधारण रूप भी बिल्कुल तक सीमित है प्रदान की गई इनपुट क्वेरी में तीन कॉलम:row_name , श्रेणी , मान . अतिरिक्त कॉलम . के लिए कोई जगह नहीं है जैसे नीचे दिए गए 2-पैरामीटर विकल्प में।

सुरक्षित रूप

crosstab(text, text) 2 . के साथ इनपुट पैरामीटर:

SELECT *
FROM   crosstab(
   'SELECT section, status, ct
    FROM   tbl
    ORDER  BY 1,2'  -- could also just be "ORDER BY 1" here

  , $$VALUES ('Active'::text), ('Inactive')$$
   ) AS ct ("Section" text, "Active" int, "Inactive" int);

रिटर्न:

 Section | Active | Inactive
---------+--------+----------
 A       |      1 |        2
 B       |      4 |        5
 C       |        |        7  -- !!
  • C . के लिए सही परिणाम नोट करें ।

  • दूसरा पैरामीटर कोई भी क्वेरी हो सकती है जो एक पंक्ति लौटाती है अंत में कॉलम परिभाषा के क्रम से मेल खाने वाली प्रति विशेषता। अक्सर आप अंतर्निहित तालिका से अलग-अलग विशेषताओं को इस तरह क्वेरी करना चाहेंगे:

      'SELECT DISTINCT attribute FROM tbl ORDER BY 1'
    

वह मैनुअल में है।

चूंकि आपको किसी भी तरह से कॉलम परिभाषा सूची में सभी कॉलमों की वर्तनी लिखनी होती है (पूर्व-निर्धारित crosstabN() वेरिएंट), आमतौर पर VALUES . में एक छोटी सूची प्रदान करना अधिक कुशल होता है प्रदर्शित की तरह अभिव्यक्ति:

    $$VALUES ('Active'::text), ('Inactive')$$)

या (मैनुअल में नहीं):

    $$SELECT unnest('{Active,Inactive}'::text[])$$  -- short syntax for long lists
  • मैंने डॉलर के भाव . का उपयोग किया उद्धरण देना आसान बनाने के लिए।

  • आप भिन्न . के साथ कॉलम भी आउटपुट कर सकते हैं डेटा प्रकार crosstab(text, text) . के साथ - जब तक मान कॉलम का टेक्स्ट प्रतिनिधित्व लक्ष्य प्रकार के लिए मान्य इनपुट है। इस तरह आपके पास भिन्न प्रकार की विशेषताएँ हो सकती हैं और आउटपुट text . हो सकता है , date , numeric आदि संबंधित विशेषताओं के लिए। अध्याय के अंत में एक कोड उदाहरण है crosstab(text, text) मैनुअल में।

db<>फिडल यहाँ

अतिरिक्त इनपुट पंक्तियों का प्रभाव

अतिरिक्त इनपुट पंक्तियों को अलग तरह से संभाला जाता है - उसी के लिए डुप्लिकेट पंक्तियां ("row_name", "श्रेणी") संयोजन - (section, status) उपरोक्त उदाहरण में।

1-पैरामीटर प्रपत्र उपलब्ध मान स्तंभों में बाएँ से दाएँ भरता है। अतिरिक्त मान छोड़ दिए जाते हैं।
पहले की इनपुट पंक्तियां जीतती हैं।

2-पैरामीटर फॉर्म प्रत्येक इनपुट मान को उसके समर्पित कॉलम में निर्दिष्ट करता है, किसी भी पिछले असाइनमेंट को ओवरराइट कर देता है।
बाद में इनपुट पंक्तियां जीत जाती हैं।

आमतौर पर, आपके पास शुरू करने के लिए डुप्लीकेट नहीं होते हैं। लेकिन अगर आप ऐसा करते हैं, तो अपनी आवश्यकताओं के अनुसार क्रम से क्रम को सावधानीपूर्वक समायोजित करें - और जो हो रहा है उसका दस्तावेजीकरण करें।
या यदि आप परवाह नहीं करते हैं तो तेजी से मनमाना परिणाम प्राप्त करें। बस प्रभाव से अवगत रहें।

उन्नत उदाहरण

  • Tablefunc का उपयोग करके एकाधिक स्तंभों पर पिवट करें - उल्लेखित "अतिरिक्त स्तंभ" भी प्रदर्शित करता है

  • CASE और GROUP BY के साथ पिवट करने का डायनामिक विकल्प


\crosstabview psql में

पोस्टग्रेज 9.6 इस मेटा-कमांड को इसके डिफ़ॉल्ट इंटरेक्टिव टर्मिनल psql में जोड़ा। आप उस क्वेरी को चला सकते हैं जिसका उपयोग आप पहले crosstab() . के रूप में करेंगे पैरामीटर और इसे \crosstabview . पर फ़ीड करें (तुरंत या अगले चरण में)। पसंद:

db=> SELECT section, status, ct FROM tbl \crosstabview

ऊपर जैसा ही परिणाम है, लेकिन यह ग्राहक पक्ष पर प्रतिनिधित्व सुविधा . है विशेष रूप से। इनपुट पंक्तियों को थोड़ा अलग तरीके से व्यवहार किया जाता है, इसलिए ORDER BY आवश्यक नहीं। \crosstabview . के लिए विवरण मैनुअल में। उस पेज के नीचे और कोड उदाहरण हैं।

dba.SE पर डेनियल वेरिट द्वारा संबंधित उत्तर (psql फीचर के लेखक):

  • मैं पिवोटेड क्रॉस जॉइन कैसे उत्पन्न करूं जहां परिणामी तालिका परिभाषा अज्ञात है?


  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. PostgreSQL में सिस्टम कॉलम को समझना

  3. psql में चालू माह रविवार की गिनती कैसे प्राप्त करें?

  4. मेरा PostgreSQL डेटाबेस डिस्क स्थान से बाहर है

  5. PostgreSQL में क्वेरी ऑप्टिमाइज़ेशन। मूल बातें समझाएं - भाग 1