CompusaMedlem sedan jan. 20023 327 inlägg Har följande SQL-query för att räkna antalet sålda biljetter till en viss flight som avgår ett visst datum.
SELECT Flight.FlightNr, Flight.DepDate, COUNT(*)
FROM Flight
INNER JOIN Ticket ON Flight.FlightNr = Ticket.FlightNr
AND Flight.DepDate = Ticket.DepDate
GROUP BY Flight.FlightNr, Flight.DepDate
Resultatet jag får av denna är exempelvis:
FLIGHTNR DEPDATE COUNT
AF330 01.03.2006 1
BA801 01.03.2006 2
Alla flighter som avgår en viss dag och har minst en biljett sålda inkulderas i resultatet. Problemet är att jag skulle vilja få med även de flighter som inte har några biljetter sålda, dvs:
FLIGHTNR DEPDATE COUNT
AF330 06.03.2006 0
AF330 01.03.2006 1
BA801 01.03.2006 2
@ndersMedlem sedan juni 200032 969 inlägg Prova med LEFT JOIN istället för INNER JOIN.
CompusaMedlem sedan jan. 20023 327 inlägg
@nders skrev:
Prova med LEFT JOIN istället för INNER JOIN.
Tack @nders! Med en left join och att jag ändrade COUNT(*) till COUNT(Ticket.FlightNr) så fungerar det :)
SELECT Flight.FlightNr, Flight.DepDate, COUNT(Ticket.FlightNr)
FROM Flight
LEFT JOIN Ticket ON Flight.FlightNr = Ticket.FlightNr
AND Flight.DepDate = Ticket.DepDate
GROUP BY Flight.FlightNr, Flight.DepDate
LarsGMedlem sedan dec. 200012 464 inlägg och
COUNT(ticket.flightnr)
Red: Detta var tänkt som ett tillägg till @nders post.
CompusaMedlem sedan jan. 20023 327 inlägg Jag trodde det fungerade helt och hållet, men jag hade fel...
Om jag ändrar:
SELECT Flight.FlightNr, Flight.DepDate, COUNT(Ticket.FlightNr)
FROM Flight
LEFT JOIN Ticket ON Flight.FlightNr = Ticket.FlightNr
AND Flight.DepDate = Ticket.DepDate
GROUP BY Flight.FlightNr, Flight.DepDate
Till:
SELECT Flight.FlightNr, Flight.DepDate, COUNT(Ticket.FlightNr)
FROM Flight
LEFT JOIN Ticket ON Flight.FlightNr = Ticket.FlightNr
AND Flight.DepDate = Ticket.DepDate
WHERE Ticket.LookAfter = 'ja'
GROUP BY Flight.FlightNr, Flight.DepDate
Dvs, nu vill jag räkna antalet LookAfter med värdet 'ja' för varje flight. Nu utesluts dock de flight som inte har några LookAfter med värdet 'ja'. Hur ska jag bära mig åt för att även detta ska tas med i resultatet?
LarsGMedlem sedan dec. 200012 464 inlägg SELECT Flight.FlightNr, Flight.DepDate, COUNT(Ticket.FlightNr)
FROM Flight
LEFT JOIN Ticket ON Flight.FlightNr = Ticket.FlightNr
AND Flight.DepDate = Ticket.DepDate
and Ticket.LookAfter = 'ja'
GROUP BY Flight.FlightNr, Flight.DepDate
CompusaMedlem sedan jan. 20023 327 inlägg
LarsG skrev:
SELECT Flight.FlightNr, Flight.DepDate, COUNT(Ticket.FlightNr)
FROM Flight
LEFT JOIN Ticket ON Flight.FlightNr = Ticket.FlightNr
AND Flight.DepDate = Ticket.DepDate
and Ticket.LookAfter = 'ja'
GROUP BY Flight.FlightNr, Flight.DepDate
Perfekt! Har suttit och brottats med detta en lång stund idag och tänka sig att jag inte kom på att man skulle inkludera det i joinen. Hur som helst. Jag försökte bygga vidare på detta och alltså inkludera både:
antalet sålda biljetter (oavsett värde på LookAfter) och antalet sålda biljetter med LookAfter = ja.
Har försökt med:
SELECT Flight.FlightNr, Flight.DepDate, COUNT(Ticket.FlightNr), COUNT(Ticket.FlightNr)
FROM Flight
LEFT JOIN Ticket ON Flight.FlightNr = Ticket.FlightNr
AND Flight.DepDate = Ticket.DepDate AND Ticket.LookAfter = 'ja'
LEFT JOIN Ticket ON Flight.FlightNr = Ticket.FlightNr
AND Flight.DepDate = Ticket.DepDate
GROUP BY Flight.FlightNr, Flight.DepDate
Men det fungerar naturligtvis inte :(
LarsGMedlem sedan dec. 200012 464 inlägg SELECT Flight.FlightNr,
Flight.DepDate,
COUNT(Ticket.FlightNr) as total,
sum(case when Ticket.LookAfter = 'ja' then 1 else 0 end) as lookafter
FROM Flight
LEFT JOIN Ticket ON Flight.FlightNr = Ticket.FlightNr
AND Flight.DepDate = Ticket.DepDate
GROUP BY Flight.FlightNr, Flight.DepDate
CompusaMedlem sedan jan. 20023 327 inlägg Helt fantastiskt! Har aldrig använt mig av case, visste inte ens att det var möjligt med SQL. Stort tack LarsG och @nders.