プロが教えるわが家の防犯対策術!

SQL文で成績と性別での人数分布を求めるクロス集計関数が出来ず困ってます。

サンプルとしては
学年 性別 評価(ABC)
1年 男  A
1年 女  A
1年 男  A
1年 男  B
2年 男  B
2年 女  C

欲しい出力としては各サンプル毎の人数です。
1年 男-A評価,男B評価,男C評価,女A評価,女B評価,女C評価
2年 男-A評価,男B評価,男C評価,女A評価,女B評価,女C評価
3年 男-A評価,男B評価,男C評価,女A評価,女B評価,女C評価



という具合です。

以前は
SELECT COUNT(*) AS 分布人数, 性別, 成績 FROM 成績
GROUP BY 年齢, 性別, 学年 HAVING 学年 = @がくねん ORDER BY 年齢,成績
というSQL文で1学年毎に抽出していました。
クロス集計で1つのSQL文で出力したいのですがいかがでしょうか?

A 回答 (2件)

表の列構成、元のデータ例、得たい結果例が示されていると、回答する側としても分かりやすいのですけどね。



次のようなSQLでは、いかがでしょうか?

select
学年,
count(case when 性別='m' and 評価='A' then 1 else null end) as 男A,
count(case when 性別='m' and 評価='B' then 1 else null end) as 男B,
count(case when 性別='m' and 評価='C' then 1 else null end) as 男C,
count(case when 性別='w' and 評価='A' then 1 else null end) as 女A,
count(case when 性別='w' and 評価='B' then 1 else null end) as 女B,
count(case when 性別='w' and 評価='C' then 1 else null end) as 女C
from t1
group by 学年
;
    • good
    • 0
この回答へのお礼

chukenkenkouさんありがとうございました。
ほぼ、このSQL文で欲しい出力が出ました。

お礼日時:2007/07/08 18:02

んーこんなのはどうでしょう、長いですけど構造は単純です。


良ければ質問者さま用に適宜書き換えてみてください。

SELECT '第一学年' AS 学年,
COUNT(CASE WHEN nenndo = '1' and sex = '男' and hyouka = 'A' THEN 1 ELSE null END) AS men_A,
COUNT(CASE WHEN nenndo = '1' and sex = '男' and hyouka = 'B' THEN 1 ELSE NULL END) AS men_B,
COUNT(CASE WHEN nenndo = '1' and sex = '男' and hyouka = 'C' THEN 1 ELSE NULL END) AS men_C,
COUNT(CASE WHEN nenndo = '1' and sex = '女' and hyouka = 'A' THEN 1 ELSE NULL END) AS women_A,
COUNT(CASE WHEN nenndo = '1' and sex = '女' and hyouka = 'B' THEN 1 ELSE NULL END) AS women_B,
COUNT(CASE WHEN nenndo = '1' and sex = '女' and hyouka = 'C' THEN 1 ELSE NULL END) AS women_C
FROM test20070707

UNION

SELECT '第二学年' AS 学年,
COUNT(CASE WHEN nenndo = '2' and sex = '男' and hyouka = 'A' THEN 1 ELSE NULL END) AS men_A,
COUNT(CASE WHEN nenndo = '2' and sex = '男' and hyouka = 'B' THEN 1 ELSE NULL END) AS men_B,
COUNT(CASE WHEN nenndo = '2' and sex = '男' and hyouka = 'C' THEN 1 ELSE NULL END) AS men_C,
COUNT(CASE WHEN nenndo = '2' and sex = '女' and hyouka = 'A' THEN 1 ELSE NULL END) AS women_A,
COUNT(CASE WHEN nenndo = '2' and sex = '女' and hyouka = 'B' THEN 1 ELSE NULL END) AS women_B,
COUNT(CASE WHEN nenndo = '2' and sex = '女' and hyouka = 'C' THEN 1 ELSE NULL END) AS women_C
FROM test20070707

UNION

SELECT '第三学年' AS 学年,
COUNT(CASE WHEN nenndo = '3' and sex = '男' and hyouka = 'A' THEN 1 ELSE NULL END) AS men_A,
COUNT(CASE WHEN nenndo = '3' and sex = '男' and hyouka = 'B' THEN 1 ELSE NULL END) AS men_B,
COUNT(CASE WHEN nenndo = '3' and sex = '男' and hyouka = 'C' THEN 1 ELSE NULL END) AS men_C,
COUNT(CASE WHEN nenndo = '3' and sex = '女' and hyouka = 'A' THEN 1 ELSE NULL END) AS women_A,
COUNT(CASE WHEN nenndo = '3' and sex = '女' and hyouka = 'B' THEN 1 ELSE NULL END) AS women_B,
COUNT(CASE WHEN nenndo = '3' and sex = '女' and hyouka = 'C' THEN 1 ELSE NULL END) AS women_C
FROM test20070707
    • good
    • 0
この回答へのお礼

t-kaさんありがとうございました。
参考にさせて頂きます。

お礼日時:2007/07/08 18:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す