プロが教える店舗&オフィスのセキュリティ対策術

Oracel9 のSQLについて教えてください。
データの削減(サマリ)を狙っているのですが・・・

下記の様なデータを結合?したいのですが、
どのようにすればいいかわかりません・・・

テーブル名:乗車時間

氏名、乗り物、乗車開始時間、乗車終了時間
Aさん、車、08:15、08:30
Aさん、車、08:30、09:00
Aさん、車、09:00、09:30

このデータを・・・・
氏名、乗り物、乗車開始時間、乗車終了時間
Aさん、車、08:15、09:30

の一行にしたいのです。
VB6とSQLを組み合わせれば、なんとか行けるのですが、
(大分、VB6に依存してしまう・・・)
Oracle側だけの処理で何とかしたいのです。

こうなると、やはりストアドプロシージャーを使用するしかないのでしょうか??

何卒、皆様のお知恵を貸して下さい。お願いします。

A 回答 (4件)

思いつくのは、こんな感じかなぁ。



select
x.氏名,
x.乗り物,
x.乗車開始時間,
(
select max(y.乗車終了時間) from t y
start with y.氏名=x.氏名 and y.乗り物=x.乗り物 and y.乗車開始時間=x.乗車開始時間
connect by prior y.氏名=y.氏名 and prior y.乗り物=y.乗り物 and prior y.乗車終了時間=y.乗車開始時間
)
from t x
where
not exists (select 1 from t z where z.氏名=x.氏名 and z.乗り物=x.乗り物 and z.乗車終了時間=x.乗車開始時間)
;
    • good
    • 0
この回答へのお礼

返信が遅くなり申し訳ございません。
迅速な回答ありがとうございました^^

バッチリです!! とても勉強になりました♪
ありがとうございます☆

また分からない時、投稿すると思いますので、
その際見かけましたら宜しくお願いします♪

お礼日時:2008/09/03 17:01

No2です。


回答したあとで、もうすこし簡略化できることに気付きました。
(私のやり方だと全件Connectするので)
SELECT 氏名,乗り物,MIN(乗車開始時間),MAX(乗車終了時間)
FROM
(SELECT MIN(GRP) GRP,氏名,乗り物,乗車開始時間,乗車終了時間
FROM
(SELECT ROWNUM-LEVEL GRP,氏名,乗り物,乗車開始時間,乗車終了時間
FROM 乗車時間
CONNECT BY PRIOR 氏名=氏名 AND PRIOR 乗り物=乗り物 AND PRIOR 乗車終了時間=乗車開始時間
ORDER SIBLINGS BY 氏名,乗り物,乗車開始時間)
GROUP BY 氏名,乗り物,乗車開始時間,乗車終了時間)
GROUP BY 氏名,乗り物,GRP
ORDER BY 1,2

でも、それを踏まえても、No.3さんの書かれたクエリの方がわかりやすいでしょうね。
    • good
    • 0
この回答へのお礼

返信が遅くなり申し訳ございません。
迅速な回答ありがとうございました^^

2度もそれも簡略して、書き込んでくれた事
本当にありがとうございます。
書き方の違いがわかってほんとに感謝です。
SQL初心者にはとても勉強になります。

また分からない時、投稿すると思いますので、
その際見かけましたら宜しくお願いします♪

お礼日時:2008/09/03 17:15

CONNECT BYは9iでも使えましたよね。


ということで、その方法ならばできますが、あまりスマートにはいきません。もしわからなければ、これよりスマートな回答が出なかったときには追加で説明します。

SELECT 氏名,乗り物,MIN(乗車開始時間),MAX(乗車終了時間)
FROM
(SELECT MIN(GRP) GRP,氏名,乗り物,乗車開始時間,乗車終了時間
FROM
(SELECT ROWNUM-LEVEL GRP,氏名,乗り物,乗車開始時間,乗車終了時間
FROM
(SELECT 氏名,乗り物,乗車開始時間,乗車終了時間 FROM 乗車時間
UNION ALL
SELECT 氏名,乗り物,NULL,乗車開始時間 FROM 乗車時間)
START WITH 乗車開始時間 IS NULL
CONNECT BY PRIOR 氏名=氏名 AND PRIOR 乗り物=乗り物 AND PRIOR 乗車終了時間=乗車開始時間
ORDER SIBLINGS BY 氏名,乗り物,乗車開始時間)
WHERE 乗車開始時間 IS NOT NULL
GROUP BY 氏名,乗り物,乗車開始時間,乗車終了時間)
GROUP BY 氏名,乗り物,GRP
ORDER BY 1,2,3
    • good
    • 0

select 氏名,乗り物,


min(乗車開始時間) 乗車開始時間,
max(乗車終了時間) 乗車終了時間
from 乗車時間
group by 氏名,乗り物
でいかがでしょうか?

この回答への補足

早速の回答ありがとうございます。

説明不足で申し訳ないのですが、データは

氏名、乗り物、乗車開始時間、乗車終了時間
Aさん、車、08:15、08:30
Aさん、車、08:30、09:00
Aさん、車、09:00、09:30
Aさん、車、09:15、09:45
Bさん、バス、08:10、08:15
Bさん、バス、08:15、08:25
Bさん、バス、08:45、08:55

とあった場合、出力するデータは、

氏名、乗り物、乗車開始時間、乗車終了時間
Aさん、車、08:15、09:30
Aさん、車、09:15、09:45
Bさん、バス、08:10、08:25
Bさん、バス、08:45、08:55

の様なデータが欲しいのです。乗車開始時間と乗車終了時間が
繋がるレコードを省いて、結合?したいのです。

補足日時:2008/09/01 17:11
    • good
    • 0

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

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