0

ここに画像の説明を入力

私はこのデータベースを持っています。すべてのテーブルが含まれているわけではありませんが、私の問題では、写真に含まれているもので十分です。

このデータベースは運送会社向けに設計されています。

ということで、予約です。どの予約も複数の住所を持つことができます。これらのタイプは (routing_type: ピックアップ、ストップ、ドロップオフ) です。私の住所は、住所または空港です。

ルーティング テーブル内では、address_id または airport_id のいずれかを使用して、ルーティングのタイプを示します。airport_id が address_id よりも数字の場合は NULL です。

私の booking_routing テーブルには、特定の予約のルーティング タイプと同じ数のエントリがあります。特定の予約に 3 つの住所がある場合、booking_routing には 3 つのエントリがあります (おそらく、ピックアップ、ストップ、ドロップオフ)。通常、必要な住所はピックアップとドロップオフの 2 つだけです。

問題: 乗車場所と降車場所を予約の他のフィールドと同じ行に表示するクエリを作成しようとしました。

例:

Booking_ID Account_ID ... Pick-Up Drop-Off
121 32 1 Main St IAD, AA-322

現在、2行でLEFT JOINを使用してそれらを取得することしかできませんでした。次のように:
Booking_ID Account_ID ... Address_Type 住所
121 32 Pick_up 1 Main St
121 32 Drop-Off IAD、AA-322

SELECT   
b.booking_id as ID, a.account_id as Acc_ID, 
MAX(CASE WHEN br.routing_type_id = 1 THEN -- 1=pick-up
    Concat(ad.address_line1, " ", api.code, " ", aii.code, "-", ap.flight_number) END) as Pick_up,
    MAX(CASE WHEN br.routing_type_id = 4 THEN  -- 4=drop-off
             Concat(ad.address_line1, " ", api.code, " ", aii.code, "-", ap.flight_number) END) as Drop_off

FROM booking b
left JOIN account a ON b.account_id = a.account_id
left join booking_routing br ON b.booking_id = br.booking_id
left join routing r ON br.routing_id = r.routing_id
left join routing_type rt ON br.routing_type_id = rt.routing_type_id
left join address ad ON r.address_id = ad.address_id
left join airport ap ON r.airport_id = ap.airport_id
left join airport_info api ON ap.airport_info_id = api.airport_info_id
left join airline_info aii ON ap.airline_info_id = aii.airline_info_id

group by b.booking_id, a.account_id;
4

1 に答える 1

0

MAXと を使用してこれを実現できますCASE

SELECT Booking_Id, 
   Account_Id, 
   MAX(CASE WHEN Address_Type = 'Pick_up' THEN Address END) Pick_Up,
   MAX(CASE WHEN Address_Type = 'Drop-Off' THEN Address END) Drop_Off
FROM YourTables...
GROUP BY Booking_Id, Account_Id

SQL フィドルのデモ

于 2013-03-30T02:20:47.377 に答える