एक एकल चयन कथन में कई श्रेणियों के लिए वापसी मायने रखता है


9

मेरे पास एक पोस्टग्रैज डेटाबेस तालिका fooहै, जिसमें अन्य चीजों के अलावा, score0 से लेकर 10 तक की सीमाएँ हैं। 10. मैं कुल अंकों की संख्या, 0 और 3 के बीच अंकों की संख्या, 4 के बीच के अंकों की संख्या वापस करने के लिए एक क्वेरी चाहता हूं। और 6, और 7 और 10 के बीच स्कोर की संख्या। कुछ इस तरह है:

SELECT
  COUNT(*) as total,
  COUNT(
    SELECT * from foo where score between 0 and 3;
  ) as low,
  COUNT(
    SELECT * from foo where score between 4 and 6;
  ) as mid,
  COUNT(
    SELECT * from foo where score between 7 and 10;
  ) as high
FROM foo;

मैंने यह कोशिश की, लेकिन बयानों SELECTमें त्रुटि मिली COUNT। किसी भी विचार मैं यह कैसे कर सकते हैं? मुझे यकीन है कि Postgres में एक सुपर सरल तरीका है। मैं अभी Google के लिए सही शब्दों का पता नहीं लगा सकता।

जवाबों:


7

बस SUM()प्रत्येक संख्या सीमा के लिए प्रति कॉलम सशर्त विवरण का उपयोग करें । कुल का उपयोग करके सम्‍मिलित किया जा सकता है SUM(1), तालिका में मौजूद सभी डेटा को एक सीमा के भीतर माना जाता है - यदि नहीं, तो बस इसे दूसरों के साथ प्रतिबंधित करें।

select sum(case when score between 0 and 3 then 1 else 0 end) as minrange,
       sum(case when score between 4 and 6 then 1 else 0 end) as midrange,
       sum(case when score between 7 and 10 then 1 else 0 end) as maxrange,
       sum(1) as total
from foo;

एसक्यूएल फिडल लिंक


8

सकल FILTERPostgres में खंड 9.4+

चूंकि Postgres 9.4 एक साफ और तेज (SQL मानक) तरीका है:

SELECT count(*) FILTER (WHERE score BETWEEN 0 AND 3)  AS low
     , count(*) FILTER (WHERE score BETWEEN 4 AND 7)  AS mid
     , count(*) FILTER (WHERE score BETWEEN 8 AND 10) AS high
     , count(*)                                       AS total
FROM   foo;

totalजोड़ता है low, midऔर high, जब तक कि NULL या अन्य मान शामिल न हों।

लिंक:

नीचे भी पढ़ें

पोस्टग्रेट्स 9.3-

तकनीक के एक जोड़े हैं:

@Phil ने एक CASEस्टेटमेंट के साथ मानक तरीका प्रदान किया (इसके अलावा sum(1), जो मानक तरीका नहीं है)। मुझे छोटे रूप का उपयोग करना पसंद है:

SELECT count(score BETWEEN 0 AND 3  OR NULL) AS low
     , count(score BETWEEN 4 AND 6  OR NULL) AS mid
     , count(score BETWEEN 7 AND 10 OR NULL) AS high
     , count(*)                              AS total
FROM   foo;

यदि आपके प्रश्न (केवल 0- 10संभव) में आपके मान निर्धारित हैं , तो और सरल करें:

SELECT count(score < 4 OR NULL)             AS low
     , count(score BETWEEN 4 AND 6 OR NULL) AS mid
     , count(score > 6 OR NULL)             AS high
     , count(*)                             AS total
FROM   foo;

थोड़ा छोटा, मुश्किल से तेज।

गंभीर अंतर

कर रहे हैं सूक्ष्म अंतर जब की तुलना sum()में फिल के जवाब :

  • सबसे महत्वपूर्ण बात, प्रति प्रलेखन :

    यह ध्यान दिया जाना चाहिए कि इसके अलावा count, जब कोई पंक्तियों का चयन नहीं किया जाता है , तो ये फ़ंक्शन एक शून्य मान लौटाते हैं। विशेष रूप से, sumकोई भी पंक्तियां शून्य नहीं होतीं, शून्य नहीं जैसा कि कोई उम्मीद कर सकता है, ...

  • count(*) है मानक तरीका और थोड़ा तेजी से sum(1)। फिर से, शून्य बनाम 0 लागू होता है।

इन प्रश्नों में से (फिल सहित) के लिए शून्य मान गिना जाता है total। यदि यह वांछनीय नहीं है, तो इसके बजाय उपयोग करें:

count(score) AS total_not_null

Pg 9.3 में SQL फेल्ड
db <> यहाँ fg in pg 10

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.