sql >> Databáze >  >> RDS >> PostgreSQL

Část 2:jak získat součet dotazu založeného na oddílu bez skutečného otáčení

Použijte řešení, které máte (buď jedno, ze zřejmých důvodů preferuji řešení pole), vložte jej do CTE a poté použijte UNION k výpočtu součtů:

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;

Agregační funkce jako count() ignorujte NULL hodnoty, takže bude počítat pouze řádky, kde jazyk existuje.

Datové typy všech sloupců v dotazech UNION se musí shodovat, takže nemůžete vrátit celočíselné hodnoty ve sloupci ve druhém dotazu, pokud první dotaz definuje tento sloupec jako text (nebo varchar). To je důvod, proč výsledek count() je třeba přenést do text

Aliasy sloupců ve druhém dotazu nejsou ve skutečnosti nutné, ale přidal jsem je, abych ukázal, jak se seznamy sloupců musí shodovat




  1. Yii2:nelze aktualizovat hodnotu sloupce o + 1

  2. Počítání řádků z poddotazu

  3. Uložená procedura MySQL s parametry

  4. vytvořit tabulku se sekvencí.nextval v oracle