あなたの要求は非常に単純に見えますが、2 つの複雑な問題があります。1 つ目は、1 つの行が他の 2 つの行の要約であるということです。これは、クエリでrollup
orを使用することを示唆しています。grouping sets
2 つ目は、データがない場合でも値が必要であるという要件です。これは、「ドライバー」サブクエリの使用を示唆しています。このようなサブクエリは、値を割り当てる前に、出力内のすべての行を定義します。でドライバー テーブルを使用しますleft outer join
。
記載されていない要件は、年を 1 回だけ言及することである場合があります。
クエリに対する次のアプローチは、その年の最終フォームをまとめます。次に左が要約に結合し、そこから値があればそれを引き出します。
with year as (
select 2013 as Year
)
select driver.label, coalesce(s.value, 0) as Value, driver.Year
from ((select 'Male' as label, year from year
) union all
(select 'Female' as label, year from year
) union all
(select 'Total' as label, year from year
)
) driver left outer join
(select coalesce(Gender, 'Total') as Gender, year.year, count(*) as value
from Students cross join year
group by Gender with Rollup
) s
on driver.year = s.year;
これは、性別が「男性」および「女性」として表されyear
、データ内に呼び出される列があることを前提としています (サンプル入力またはテーブル形式がない場合、列名とサンプル値を推測する必要があります)。