2017-11-08 3 views
0

Ich habe drei Tabellen:SQL Query Manipulation

BookingNode, Buchung AirTrip

AirTrip:

+----+------------+ 
| ID | Name | 
+----+------------+ 
| 0 | One way | 
| 1 | Round trip | 
| 2 | Circle  | 
| 3 | Other  | 
+----+------------+ 

Wann immer wir eine Buchung speichern wir die Daten als: BookingNode Tabelle

+--------+-------------------+------------+----------------------+ 
| ID | CustomerGivenName | IPAddress |  Email   | 
+--------+-------------------+------------+----------------------+ 
| 177022 | xfghfh   | 2130706473 | [email protected] | 
| 177021 | cfggjfj   | 2130706473 | [email protected] | 
+--------+-------------------+------------+----------------------+ 

Buchungstabelle:

+--------+---------------+-----------+------------+------------+ 
| ID | BookingNodeID | AirTripID | AirLineId | Provider | 
+--------+---------------+-----------+------------+------------+ 
| 181251 |  177020 |   1 |  978 |  Jet | 
| 181252 |  177021 |   0 |  982 |   Go | 
| 181253 |  177021 |   0 |  978 |  Jet | 
+--------+---------------+-----------+------------+------------+ 

Wenn Hin- und Rückflug gebucht und ProviderID ist selbe dann ein einziger Eintrag in Buchung Tabelle mit AirTripID Wert als 1. (Buchungsnummer: 181251 und Provider Jet) getan Aber wenn Anbieter unterscheiden sich sowohl für die Beine dann werden zwei Einträge in der Buchungstabelle mit AirTripID für beide Einträge gemacht (Buchungs-ID: 181252 und 181253 Provider Go, Jet). In diesem Fall ist der BookingNodeID-Wert gleich.

Prob: Ich muss eine Abfrage schreiben, um verschiedene Arten von Buchungen zu erhalten (Oneway, RoundTrip, Circle). Aber wenn ich mich bei AirTripID anmelde, gibt es mir falsche Ergebnisse. Wie kann ich schreibe meine Abfrage zu wissen, korrekte Ergebnisse zu geben, dass BookingNodeID für Hin- und Rück die gleiche sein wird (beide Einträge in Buchung Tabelle)

Beispielausgabe

+-------------+---------------+-------------------+------------+ 
| AirTripName | BookingNodeID | CustomerGivenName | IPAddress | 
+-------------+---------------+-------------------+------------+ 
| TwoWay  |  177020 | xfghfh   | 2130706473 | 
| TwoWay  |  177021 | cfggjfj   | 2130706473 | 
+-------------+---------------+-------------------+------------+ 

Antwort

0

Grundsätzlich dieser Code möglicherweise einen Fehler haben aufgrund meiner Faulheit syntom der Dateneingabe. Aber, die Logik der Abfrage ist, wenn b.AirTripID 0 ist, zusätzliche Bedingung hinzufügen, welche Gruppe von Booking. Wenn das Ergebnis mehr als 1 Zeile zurückgibt, ist es tatsächlich 2-Wege. Daher wird AirTripType zu 1, andernfalls bleibt es gleich zu b.AirTripID. Sie können unten kopieren und versuchen, zu beheben, wenn es einen Fehler gibt. Ich glaube, dass die Logik basierend auf Ihrem erwarteten Ergebnis funktionieren sollte.

select 
    bd.ID, 
    bd.CustomerGivenName, 
    case b.AirTripID 
    when 1 then 1 
    when 2 then 2 
    when 3 then 3 
    when 0 then 
    case select BookingNodeID 
    from Booking 
    where Booking.BookingNodeID = bd.ID group by BookingNodeID having Count(BookingNodeID) 
    when 1 then 1 
    else 0 end as AirTripType, 
    bd.IPAddress 
    from BookingNode bd 
    inner join (select BookingNodeID ,AirTripID from Booking group by BookingNodeID ,AirTripID) as b on b.BookingNodeID = bd.ID 
    where id=177021 
0

Probieren Sie diese

WITH CTE 
AS 
(
SELECT 
    SeqNo = ROW_NUMBER() OVER(PARTITION BY BN.ID ORDER BY B.ID), 
    B.BookingNodeID, 
    BN.CustomerGivenName, 
    BN.IPAddress, 
    AirTripId = A.ID, 
    AirTripNm = A.Name 
    FROM Booking B 
     INNER JOIN AirTrip A 
     ON A.ID = B.AirTripID 
     LEFT JOIN BookingNode BN 
     ON B.BookingNodeID = BN.id 
) 
SELECT 
    C1.SeqNo, 
    AirTripName = CASE WHEN C2.SeqNo IS NOT NULL 
         THEN 'Round trip' 
        ELSE C1.AirTripNm END, 
    C1.BookingNodeID, 
    C1.CustomerGivenName, 
    C1.IPAddress 
    FROM CTE C1 
    LEFT JOIN CTE C2 
     ON C1.BookingNodeID = C2.BookingNodeID 
     AND C2.SeqNo = 2 
    WHERE c1.SeqNo = 1 

SQL Fiddle Link Here

0
Select distinct bk.bookingnodeid,cst.customername,ipaddress, 
case when count(airtripid)over(partition by bookingnodeid order by bookingnodeid)=2 then 'RoundTrip' else name end As AirTripName 
from booking bk 
inner join airlinetrip at 
on bk.airtripid=at.id 
inner join customer cst 
on cst.id=bk.bookingnodeid