sql >> Database teknologi >  >> RDS >> PostgreSQL

Del 2:hvordan man får summen af ​​en partitionsbaseret forespørgsel uden faktisk at pivotere

Brug den løsning, du har (enten, jeg foretrækker array-løsningen af ​​indlysende årsager), sæt den ind i en CTE, og brug derefter UNION til at beregne totalerne:

med elever som ( vælg elevnr, navn, gradenumber, sprog[1] som sprog_1, sprog[2] som sprog_2, sprog[3] som sprog_3, sprog[4] som sprog_4, sprog[5] som language_5 FROM ( VÆLG s.studentnumber som elevnr, p.firstname AS name, sl.gradenumber as gradenumber, array_agg(DISTINCT l.text) as languages ​​FROM student s JOIN elev p ON p.id =s.pupilid JOIN elevsprog pl på pl .pupilid =p.id JOIN sprog l på l.id =pl.languageid JOIN skoleniveau sl ON sl.id =p.schoollevelid GRUPPE AF s.studentnummer, s.fornavn ) t)vælg *fra studentsunion allselect null som studentnr, null som navn, null som gradenumber, count(language_1)::text, count(language_2)::text, count(language_3)::text, count(language_4)::text, count(language_5)::tekstfra elever;

Samlede funktioner som count() ignorer NULL værdier, så det vil kun tælle rækker, hvor der findes et sprog.

Datatyperne for alle kolonner i forespørgslerne i en UNION skal matche, så du kan ikke returnere heltalsværdier i en kolonne i den anden forespørgsel, hvis den første forespørgsel definerer denne kolonne som tekst (eller varchar). Det er derfor resultatet af count() skal castes til tekst

Kolonnealiasserne i den anden forespørgsel er egentlig ikke nødvendige, men jeg har tilføjet dem for at vise, hvordan kolonnelisterne skal matche




  1. MySQL-forespørgsel for at finde de seneste 3 datoer i en tabel

  2. PostgreSQL DATEADD() Tilsvarende

  3. finde ud af, om der kommer et jubilæum om n dage i MySql

  4. Genbruges numeriske primærnøgler for slettede poster i en database til fremtidige nye poster?