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:
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
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?
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
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
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