webForumDet fria alternativet

Problem med Count(*) och join, räkna noll?

8 svar · 671 visningar · startad av Compusa

CompusaMedlem sedan jan. 20023 327 inlägg
#1

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
#2

Prova med LEFT JOIN istället för INNER JOIN.

CompusaMedlem sedan jan. 20023 327 inlägg
#3

@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
#4

och

COUNT(ticket.flightnr)

Red: Detta var tänkt som ett tillägg till @nders post.

CompusaMedlem sedan jan. 20023 327 inlägg
#5

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
#6
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
#7

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
#8
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
#9

Helt fantastiskt! Har aldrig använt mig av case, visste inte ens att det var möjligt med SQL. Stort tack LarsG och @nders.

129 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)