दिलचस्प पोस्ट
पायथन में रेंज से बाहर काम करने के स्थान को क्यों स्थानांतरित करना है? GPU टाइमआउट, विंडो 7 को बढ़ाने के लिए रजिस्ट्री संशोधित करें एक SQLite "IN" खंड के लिए पैरामीटर प्रतिस्थापन उदाहरण के साथ जावास्क्रिप्ट मॉड्यूल पैटर्न AngularJS: फैक्टरी और सेवा? Var कीवर्ड का क्या मतलब है? पायथन के माध्यम से लिनक्स पर प्रक्रिया सूची पंडस डेटाफ्रेम में पंक्तियों के सबसेट को संशोधित करना मैं Xcode 6 या अधिक में एक श्रेणी कैसे बना सकता हूं? जावा से शेल कमांड चलाएं सभी जावास्क्रिप्ट त्रुटियों को पकड़ो और उन्हें सर्वर पर भेजें सी # स्प्लिट ए स्ट्रिंग बाय एक स्ट्रिंग jQuery और टिंइएमईईई: टेडेरेआ वैल्यू प्रस्तुत नहीं होता है Keras प्रशिक्षण डेटा आकार misinterprets कॉलम चौड़ाई को शून्य पर सेट नहीं कर सका, अर्थात अदृश्य नहीं किया गया स्तंभ

पोस्टग्रेएसक्यूएल क्रॉसस्टैब क्वेरी

क्या कोई भी पोस्टगेएसएसएलएल में क्रॉसस्टैब क्वेरीज़ कैसे बना सकता है?
उदाहरण के लिए मेरे पास निम्न तालिका है:

Section Status Count A Active 1 A Inactive 2 B Active 4 B Inactive 5 

मैं निम्न क्रोसटैब को वापस करने के लिए क्वेरी चाहूंगा:

 Section Active Inactive A 1 2 B 4 5 

क्या यह संभव है?

वेब के समाधान से एकत्रित समाधान "पोस्टग्रेएसक्यूएल क्रॉसस्टैब क्वेरी"

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

 CREATE EXTENSION tablefunc; 

बेहतर परीक्षण केस

 CREATE TEMP TABLE t ( section text , status text , ct integer -- don't use "count" as column name. ); INSERT INTO t VALUES ('A', 'Active', 1), ('A', 'Inactive', 2) , ('B', 'Active', 4), ('B', 'Inactive', 5) , ('C', 'Inactive', 7); -- 'C' with 'Active' is missing 
  • count मानक एसक्यूएल में आरक्षित शब्द है पोस्टग्रेज़ इसे अनुमति देता है लेकिन मैं उनसे पहचानकर्ता के रूप में नहीं बचना चाहता हूं।

सरल रूप – अनुपलब्ध विशेषताओं के लिए फिट नहीं है

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

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

यह दिखाता है:

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

सुरक्षित रूप

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

 SELECT * FROM crosstab( 'SELECT section, status, ct FROM t 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
  बी |  4 |  5
  सी |  |  7 - !!
  • C लिए सही परिणाम नोट करें

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

     'SELECT DISTINCT attribute FROM tbl ORDER BY 1' 

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

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

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

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

     $$SELECT unnest('{Active,Inactive}'::text[])$$ -- shorter for long lists 
  • मैं कोटेशन को आसान उद्धृत करने के लिए उद्धृत करता हूं

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

उन्नत उदाहरण

  • टेबलफंक का उपयोग करते हुए एकाधिक स्तंभों पर धुरी – भी उल्लेख किया "अतिरिक्त कॉलम"

  • केस और ग्रुप द्वारा धुरी के लिए डायनामिक विकल्प

\crosstabview में psql

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

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

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

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

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


पहले स्वीकार किए गए उत्तर पुराना है।

  • समारोह crosstab(text, integer) का संस्करण पुराना है। दूसरा integer पैरामीटर को अनदेखा किया जाता है। मैं वर्तमान मैनुअल उद्धृत:

    crosstab(text sql, int N)

    क्रॉसस्टैब का अप्रचलित संस्करण crosstab(text) पैरामीटर N को अब अनदेखा किया गया है, चूंकि मूल्य कॉलम की संख्या हमेशा कॉलिंग क्वेरी द्वारा निर्धारित की जाती है

  • बिना ढलाई और पुन: नामकरण

  • यदि कोई पंक्ति में सभी विशेषताओं नहीं हैं तो यह विफल हो जाता है लापता गुणों को ठीक से संभाल करने के लिए ऊपर दो इनपुट पैरामीटर के साथ सुरक्षित संस्करण देखें।

  • crosstab() के एक-पैरामीटर फॉर्म में ORDER BY की आवश्यकता है नियम पुस्तिका:

    अभ्यास में एसक्यूएल क्वेरी में हमेशा ORDER BY 1,2 लिए ORDER BY 1,2 निर्दिष्ट करना चाहिए कि यह सुनिश्चित करने के लिए कि इनपुट पंक्तियों का ठीक प्रकार से आदेश दिया गया है

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

 CREATE EXTENSION tablefunc; 

आपके मामले में, मेरा मानना ​​है कि ऐसा कुछ दिखाई देगा:

 CREATE TABLE t (Section CHAR(1), Status VARCHAR(10), Count integer); INSERT INTO t VALUES ('A', 'Active', 1); INSERT INTO t VALUES ('A', 'Inactive', 2); INSERT INTO t VALUES ('B', 'Active', 4); INSERT INTO t VALUES ('B', 'Inactive', 5); SELECT row_name AS Section, category_1::integer AS Active, category_2::integer AS Inactive FROM crosstab('select section::text, status, count::text from t',2) AS ct (row_name text, category_1 text, category_2 text); 
 SELECT section, SUM(CASE status WHEN 'Active' THEN count ELSE 0 END) AS active, SUM(CASE status WHEN 'Inactive' THEN count ELSE 0 END) AS inactive FROM t GROUP BY section 

JSON एकत्रीकरण के साथ समाधान:

 CREATE TEMP TABLE t ( section text , status text , ct integer -- don't use "count" as column name. ); INSERT INTO t VALUES ('A', 'Active', 1), ('A', 'Inactive', 2) , ('B', 'Active', 4), ('B', 'Inactive', 5) , ('C', 'Inactive', 7); SELECT section, (obj ->> 'Active')::int AS active, (obj ->> 'Inactive')::int AS inactive FROM (SELECT section, json_object_agg(status,ct) AS obj FROM t GROUP BY section )X 

माफ करना, यह पूरी नहीं है क्योंकि मैं यहां इसका परीक्षण नहीं कर सकता, लेकिन यह आपको सही दिशा में मिल सकता है। मैं उस चीज़ से अनुवाद कर रहा हूं जिसका उपयोग मैं एक समान क्वेरी करता हूं:

 select mt.section, mt1.count as Active, mt2.count as Inactive from mytable mt left join (select section, count from mytable where status='Active')mt1 on mt.section = mt1.section left join (select section, count from mytable where status='Inactive')mt2 on mt.section = mt2.section group by mt.section, mt1.count, mt2.count order by mt.section asc; 

मैं जिस कोड से काम कर रहा हूं वह है:

 select m.typeID, m1.highBid, m2.lowAsk, m1.highBid - m2.lowAsk as diff, 100*(m1.highBid - m2.lowAsk)/m2.lowAsk as diffPercent from mktTrades m left join (select typeID,MAX(price) as highBid from mktTrades where bid=1 group by typeID)m1 on m.typeID = m1.typeID left join (select typeID,MIN(price) as lowAsk from mktTrades where bid=0 group by typeID)m2 on m1.typeID = m2.typeID group by m.typeID, m1.highBid, m2.lowAsk order by diffPercent desc; 

जो एक प्रकार की आईडी, उच्चतम कीमत की बोली वापस कर देगा और सबसे कम कीमत की मांग की जाएगी और दोनों के बीच का अंतर (एक सकारात्मक अंतर का मतलब होगा कि यह कुछ भी बेचा जा सकता है जितना कम खरीदा जा सकता है)।