使用しているソリューション(どちらか、明らかな理由でアレイソリューションを好む)を使用し、それをCTEに入れてから、UNIONを使用して合計を計算します。
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;
count()
のような集計関数 NULL
を無視する 値なので、言語が存在する行のみをカウントします。
UNIONのクエリのすべての列のデータ型は一致する必要があるため、最初のクエリで列がテキスト(またはvarchar)として定義されている場合、2番目のクエリの列に整数値を返すことはできません。そのため、count()
の結果は text
にキャストする必要があります
2番目のクエリの列エイリアスは実際には必要ありませんが、列リストがどのように一致する必要があるかを示すためにそれらを追加しました