sql >> Database >  >> RDS >> PostgreSQL

Deel 2:hoe de som van een op partitie gebaseerde query te krijgen zonder echt te draaien?

Gebruik de oplossing die je hebt (een van beide, ik geef de voorkeur aan de array-oplossing om voor de hand liggende redenen), plaats deze in een CTE en gebruik vervolgens UNION om de totalen te berekenen:

with students as (
  select studentnr, 
         name, 
         gradenumber, 
         languages[1] as language_1,
         languages[2] as language_2,
         languages[3] as language_3,
         languages[4] as language_4,
         languages[5] as language_5
  FROM (       
    SELECT s.studentnumber as studentnr, 
           p.firstname AS name,
           sl.gradenumber as gradenumber,
           array_agg(DISTINCT l.text) as languages
    FROM student s
        JOIN pupil p ON p.id = s.pupilid    
        JOIN pupillanguage pl on pl.pupilid = p.id
        JOIN language l on l.id = pl.languageid
        JOIN schoollevel sl ON sl.id = p.schoollevelid
    GROUP BY s.studentnumber, p.firstname
  ) t
)
select *
from students
union all
select null as studentnr,
       null as name, 
       null as gradenumber, 
       count(language_1)::text,
       count(language_2)::text, 
       count(language_3)::text, 
       count(language_4)::text, 
       count(language_5)::text
from students;

Geaggregeerde functies zoals count() negeer NULL waarden, dus het telt alleen rijen waar een taal bestaat.

De gegevenstypen van alle kolommen in de query's van een UNION moeten overeenkomen, dus u kunt geen integerwaarden in een kolom in de tweede query retourneren als de eerste query die kolom als tekst (of varchar) definieert. Daarom is het resultaat van de count() moet worden gecast naar text

De kolomaliassen in de tweede zoekopdracht zijn niet echt nodig, maar ik heb ze toegevoegd om te laten zien hoe de kolomlijsten moeten overeenkomen




  1. PHP Javascript? Doe iets wanneer de gebruiker de pagina of browser sluit

  2. Sleutelwaardepaar in PostgreSQL

  3. Een multidimensionale array maken op basis van query

  4. Wat is sneller/beter te gebruiken:de MySQL- of PHP md5-functie?