डेटाबेस के अनुसार एक बार अतिरिक्त मॉड्यूलtablefunc
स्थापित करें , जो फ़ंक्शन प्रदान करता है । चूंकि Postgres 9.1 आप इसके लिए उपयोग कर सकते हैं :crosstab()
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);
यह दिखाता है:
धारा | सक्रिय | निष्क्रिय
--------- + -------- + ----------
ए | 1 | 2
B | 4 | 5
सी | 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);
यह दिखाता है:
धारा | सक्रिय | निष्क्रिय
--------- + -------- + ----------
ए | 1 | 2
B | 4 | 5
सी | | 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 <> यहाँ fiddle
उन्नत उदाहरण हैं
\crosstabview
psql में
9.6 पोस्टर्स ने इस मेटा-कमांड को अपने डिफ़ॉल्ट इंटरैक्टिव टर्मिनल psll में जोड़ा । आप पहले crosstab()
पैरामीटर के रूप में उपयोग की जाने वाली क्वेरी को चला सकते हैं और उसे \crosstabview
(तुरंत या अगले चरण में) फीड कर सकते हैं । पसंद:
db=> SELECT section, status, ct FROM tbl \crosstabview
उपरोक्त के समान परिणाम, लेकिन यह विशेष रूप से क्लाइंट की ओर एक प्रतिनिधित्व सुविधा है । इनपुट पंक्तियों को थोड़ा अलग तरीके से व्यवहार किया जाता है, इसलिए ORDER BY
आवश्यक नहीं है। \crosstabview
मैनुअल के लिए विवरण । उस पृष्ठ के निचले भाग में अधिक कोड उदाहरण हैं।
संबंधित जवाब dba.SE पर Daniel Vérité (psql फीचर के लेखक):
पहले से स्वीकार किए जाते हैं जवाब पुरानी हो चुकी है।
फ़ंक्शन crosstab(text, integer)
का संस्करण पुराना है। दूसरे integer
पैरामीटर को नजरअंदाज किया जाता है। मैं वर्तमान मैनुअल को उद्धृत करता हूं :
crosstab(text sql, int N)
...
का अप्रचलित संस्करण crosstab(text)
। पैरामीटर N
को अब नजरअंदाज कर दिया गया है, क्योंकि मूल्य कॉलम की संख्या हमेशा कॉलिंग क्वेरी द्वारा निर्धारित की जाती है
अनावश्यक कास्टिंग और नामकरण।
यह विफल रहता है अगर एक पंक्ति में सभी विशेषताएँ नहीं हैं। लापता विशेषताओं को ठीक से संभालने के लिए ऊपर दो इनपुट मापदंडों के साथ सुरक्षित संस्करण देखें।
ORDER BY
के एक-पैरामीटर रूप में आवश्यक है crosstab()
। नियम पुस्तिका:
व्यवहार में SQL क्वेरी को हमेशा ORDER BY 1,2
यह सुनिश्चित करने के लिए निर्दिष्ट करना चाहिए कि इनपुट पंक्तियों को ठीक से आदेश दिया गया है