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