基本的に、数えているものすべてでグループ化する必要があります。これは、学年、人種、性別のようです。最初にそれを行います。必要な方法ですべてを行にまとめます。
混乱を招く可能性があるのは、レポートに 2 つのレベルのグループ化があることです。実際には、次のようになります。
create view V as
SELECT gl.title as Grade
, s.sex
, s.race
, COUNT (s.student_id) as Q
FROM students as s
JOIN student_enrollment as se
ON s.student_id = se.student_id
JOIN school_gradelevels gl
ON se.school_id = gl.school_id
AND se.grade_id = gl.id
WHERE
se.syear = 2012
AND se.end_date IS NULL
AND se.school_id = 10
group by gl.title, s.sex, s.race
select Grade, race, sex, Q
from V
UNION
select Grade, race, 'Z', sum(Q) as Q
from V
group by Grade, race
それをクロス集計レポートに変換する方法は、自由に使用できるツールによって異なります。pivot
演算子または一連のcase
を使用して、SQL で可能select
です。コツは、人種ごとに 3 つの列 (男性、女性、両方) が必要であることに注意することです。少し面倒ですが、サンプルはこちら
select Grade, 1 as sort_order
, max(case race when 1 then
case sex when 'M' then Q end end) as r1mq
, NULL as r1mb
, max(case race when 1 then
case sex when 'F' then Q end end) as r1fq
, max(case race when 2 then
case sex when 'M' then Q end end) as r2mq
, NULL as r2mb
, max(case race when 2 then
case sex when 'F' then Q end end) as r2fq
...
from V group by Grade
UNION
select Grade, 2 as sort_order
, NULL as r1mq
, max(case race when 1 then
case sex when 'Z' then Q end end) as r1bq
, NULL as r1fq
, NULL as r2mq
, max(case race when 2 then
case sex when 'Z' then Q end end) as r2bq
, NULL as r2fq
...
from V group by Grade
order by Grade, sort_order
これにより、学年ごとに 2 つの行が生成され、各行の 2 番目の行に生徒の合計が表示されます。
あなたはアイデアを得る。また、学年と性別、および学年のみでグループ化された学生をカウントするためのクエリも必要です。これらは、ピボット クエリの出力に結合できます。そして、レースごとの合計、一番下の行は、グレード99またはそれを一番下に並べ替えるために結合されています。結果は、レポートの行と列のレイアウトと一致します。