sql >> データベース >  >> RDS >> PostgreSQL

パート2:実際にピボットせずにパーティションベースのクエリの合計を取得する方法

    使用しているソリューション(どちらか、明らかな理由でアレイソリューションを好む)を使用し、それを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番目のクエリの列エイリアスは実際には必要ありませんが、列リストがどのように一致する必要があるかを示すためにそれらを追加しました




    1. SQL ServerのSELECTから更新するにはどうすればよいですか?

    2. UptimeInfrastructureMonitorを使用してデータベースのパフォーマンスを追跡します

    3. パフォーマンスをテストするために、1つのページで複数のリクエスト(つまり4000以上)をシミュレートするにはどうすればよいですか?

    4. データファイルとStatisticaのマージ、パート2