MySQL 8.0.25を使用
1つのカラムが、他のカラムによって意味が決定するといったテーブルがあります。
ここでの区分は入退場を表していて、1が入場、2が退場を意味します。
時間のカラムは区分とセットで意味が決定します。
useStationテーブル
ユーザID | 日付 | 駅 | 時間 | 区分 |
---|---|---|---|---|
A001 | 9/21 | AAA | 11:28 | 1 |
A001 | 9/21 | BBB | 12:20 | 2 |
A001 | 9/22 | CCC | 23:26 | 1 |
A001 | 9/23 | DDD | 00:09 | 2 |
これをSQLで、ユーザ毎に以下のようなデータになるよう検索をしています。
SQL
1select distinct 2 userID,date,entrance.station,entrance.time,exit.station,exit.time 3from ( 4 select userID,date 5 from useStation 6 where userID = "A001" 7) as mainKey 8left join ( 9 select userID,date,station,time 10 from useStation 11 where class = '1' 12) as entrance 13on 14 Mainkey.userId = entrance.userId and 15 mainKey.date = entrance.date 16left join ( 17 select userID,date,station,time 18 from useStation 19 where class = '2' 20) as exit 21on 22 mainkey.userId = exit.userId 23 and mainkey.date = exit.date
|ユーザID|日付|入場駅|入場時間|退場駅|退場時間|
|:--:|:--:|:--:|:--:|:--:|
|A001|9/21|AAA|11:28|BBB|12:20|
|A001|9/22|CCC|23:26||
|A001|9/23|||DDD|00:09|
区分が1の時間と、区分が2の時間をLEFTJOINで結合しています。
出来上がった後にふと、このSQLは冗長で、CASEやらIFやらを使えば結合を使わなくてもできるのではないかと思いました。
しかし、どうしてもTHENで結果の欄を制御する方法が分からず質問いたしました。
自分が作成したSQLでも動作自体は問題ないとは思うのですが、
分かる方、もっといい方法を知っている方がいましたら、後学の為にもよろしくお願いいたします。
追記
同じユーザが同じ日に複数回の入退場を行ったときについて、
多い方のデータ分行が増えていく様な想定です。
理想は以下のようになる事でした。
|ユーザID|日付|入場駅|入場時間|退場駅|退場時間|
|:--:|:--:|:--:|:--:|:--:|
|A001|9/21|AAA|11:28|BBB|12:20|
|A001|9/21|BBB|23:26||
|A001|9/22|AAA|08:53|AAA|00:18|
|A001|9/22|||BBB|09:45|
が、自分の実装では値を表示する時のロジックで処理する前提として、
以下のようになっています。
|ユーザID|日付|入場駅|入場時間|退場駅|退場時間|
|:--:|:--:|:--:|:--:|:--:|
|A001|9/21|AAA|11:28|BBB|12:20|
|A001|9/21|BBB|23:26|BBB|12:20|
|A001|9/22|AAA|08:53|AAA|00:18|
|A001|9/22|AAA|08:53|BBB|09:45|
回答2件
あなたの回答
tips
プレビュー