- ベストアンサー
Oracel9 のSQLについて教えてください。
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側だけの処理で何とかしたいのです。 こうなると、やはりストアドプロシージャーを使用するしかないのでしょうか?? 何卒、皆様のお知恵を貸して下さい。お願いします。
- みんなの回答 (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.乗車開始時間) ;
その他の回答 (3)
- jamshid6
- ベストアンサー率88% (591/669)
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さんの書かれたクエリの方がわかりやすいでしょうね。
お礼
返信が遅くなり申し訳ございません。 迅速な回答ありがとうございました^^ 2度もそれも簡略して、書き込んでくれた事 本当にありがとうございます。 書き方の違いがわかってほんとに感謝です。 SQL初心者にはとても勉強になります。 また分からない時、投稿すると思いますので、 その際見かけましたら宜しくお願いします♪
- jamshid6
- ベストアンサー率88% (591/669)
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
- kokorone
- ベストアンサー率38% (417/1093)
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 の様なデータが欲しいのです。乗車開始時間と乗車終了時間が 繋がるレコードを省いて、結合?したいのです。
お礼
返信が遅くなり申し訳ございません。 迅速な回答ありがとうございました^^ バッチリです!! とても勉強になりました♪ ありがとうございます☆ また分からない時、投稿すると思いますので、 その際見かけましたら宜しくお願いします♪