- PR -

2レコードを1行で表示する(?)方法

1
投稿者投稿内容
nishiman
常連さん
会議室デビュー日: 2002/06/26
投稿数: 40
投稿日時: 2004-09-08 02:22
・環境:WebLogic、Struts、Oracleで開発。
DB上、データがテーブルAに次のように入っているとして、
クラス名 性別 国語平均点 算数平均点
-------- ----- -------- --------
クラスA  男    80    90
クラスA  女    90    70
クラスA  全    85    80
クラスB  男    70    80
クラスB  女    80    80
クラスB  全    75    80
クラスC  男    60    90
クラスC  女    80    70
クラスC  全    70    80
クラスD  女    90    90
クラスD  全    90    90

このようなデータを次のようにWebで、
クラス  男:国語平均 女:国語平均
-------- ------------ ----------
クラスA     80     90
クラスB     70     80
クラスC     60     80
クラスD     −     90

表示したい場合、SQLで、
select a.クラス, a.国語平均点
from テーブルA a
where a.性別 in ('男','女')
order by a.クラス名 asc, a.性別 asc

のように取得し、Javaで値を判断して1つ1つ指定の場所へ
入れていく処理になってしまうのでしょうか。他にいいやり方みたいなことが
あれば教えていただきたく思っております。
宜しくお願いします。
たーぞう
ぬし
会議室デビュー日: 2003/08/08
投稿数: 317
お住まい・勤務地: お花畑
投稿日時: 2004-09-08 08:59
SQLで

select a.クラス, a.国語平均点, b.国語平均点
from テーブルA a,テーブルA b
where a.性別 = '男'
and b.性別 = '女'
and a.クラス名 = b.クラス名
order by a.クラス名 asc

とやる方法もあります。
nishiman
常連さん
会議室デビュー日: 2002/06/26
投稿数: 40
投稿日時: 2004-09-08 10:10
クラスDだけ、女しかいないクラスです。
このクラスを出すためにはどうすればいいのでしょう?
あいつー
ベテラン
会議室デビュー日: 2004/05/20
投稿数: 89
投稿日時: 2004-09-08 10:32
あいつーです。

SQLで言うところの外部結合を使ってみては如何でしょうか。

#というか、これってJavaの話題ですか?
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2004-09-08 10:50
 Javaというより、明らかにオラクルの問題なので、
Database Expertの方に投稿した方が良かったかもしれませんね・・・。

 下記のどちらかの方法でいけませんか?

1.外部結合
SELECT 女.クラス,男.国語平均点,女.国語平均点
FROM (SELECT * FROM テーブルA WHERE 性別='男') 男,
(SELECT * FROM テーブルA WHERE 性別='女') 女
WHERE 女.クラス=男.クラス(+)

2.UNIONで付け足す
SELECT 女.クラス,男.国語平均点,女.国語平均点
FROM (SELECT * FROM テーブルA WHERE 性別='男') 男,
(SELECT * FROM テーブルA WHERE 性別='女') 女
WHERE 女.クラス=男.クラス
UNION
SELECT クラスD.クラス,'-' 国語平均点,クラスD.国語平均点
FROM (SELECT * FROM テーブルA WHERE クラス='クラスD') クラスD

 最近、オラクルは触っていないので、ボケているかも・・・。
たるたる
会議室デビュー日: 2003/09/29
投稿数: 16
投稿日時: 2004-09-08 20:04
takuさんの方法でしたら
”クラスDだけ、女しかいないクラスです。”
と分かっている場合は良いですが、
”クラス何とかは、男しかいないクラスです。”
もあった場合は、対応できなくなってしまいます。

この場合、DECODE、UNION ALLを使えばできると思います。
※-1は該当無しの意味で使用。

DECODEの例
コード:
SELECT クラス
     , MAX(DECODE(性別, '男', 国語平均点, -1)) AS "男:国語平均"
     , MAX(DECODE(性別, '女', 国語平均点, -1)) AS "女:国語平均"
  FROM テーブルA
 WHERE 性別 IN ('男', '女')
 GROUP BY クラス



UNION ALLの例
コード:
SELECT クラス
     , MAX(男国語平均) AS "男:国語平均"
     , MAX(女国語平均) AS "女:国語平均"
  FROM (
  SELECT クラス, 国語平均点 AS 男国語平均, -1 AS 女国語平均
    FROM テーブルA
   WHERE 性別 = '男'
  UNION ALL
  SELECT クラス, -1, 国語平均点
    FROM テーブルA
   WHERE 性別 = '女')
 GROUP BY クラス


しかし、これが良い方法かわかりません。
DB依存になる場合もありますし・・・。
再利用性も低くなりますし・・・。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-09-08 20:13
個人的には、SQLで頑張るより最初の書き込みにあった、

引用:

表示したい場合、SQLで、
select a.クラス, a.国語平均点
from テーブルA a
where a.性別 in ('男','女')
order by a.クラス名 asc, a.性別 asc

のように取得し、Javaで値を判断して1つ1つ指定の場所へ
入れていく処理になってしまうのでしょうか。


このやり方で実装するほうがいいと思います。
1

スキルアップ/キャリアアップ(JOB@IT)