Question

I'm having an issue with a large (100,000s record) SQL database.

Here's the basic structure:

bookings - bookingcode, bookingdate

payments - paycode, bookingcode, paydate, payamount

pupilrecords - prcode, bookingcode, lessonscode, coursecode

lessons - lessoncode, coursecode, resortcode

resorts - resortcode, resortname

Notes
The pupil record can contain either a lessoncode or a coursecode but not both.
A record in the lessons table may or may not contain a coursecode, if it does, that links to the pupil record, if it doesn't, the pupil record is linked by the lessoncode.

I need to run a report that shows what payments are received on a particular date. Here's the SQL code I run at the moment:

SELECT payments.payamount,
  (COALESCE(resorts1.resortname, '') + COALESCE(resorts2.resortname, '')) AS rname
FROM   payments
LEFT JOIN   pupilbookings
       ON  payments.bookingcode = pupilbookings.bookingcode
LEFT JOIN   lessons  AS lessons1
       ON  pupilbookings.lessonscode = lessons1.lessonscode
LEFT JOIN   resorts  AS resorts1
       ON  lessons1.resortcode = resorts1.resortcode
LEFT JOIN   lessons  AS lessons2
       ON  pupilbookings.coursecode = lessons2.coursecode
LEFT JOIN   resorts  AS resorts2
       ON  lessons2.resortcode = resorts2.resortcode
WHERE  paydate = ' & date_here & '
GROUP BY payamount,
         resorts1.resortname,
         resorts2.resortname
ORDER BY rname

All runs well as long as a booking hasn't got two pupilrecords - one with a lessoncode, the other a coursecode that point to separate "lessons" records but ultimately one "resorts" record". If that happens, the payment is listed twice.

How can I group the resortname (generated as rname) so that the record will only appear once even if it's linked from the original payment in two ways.

I hope that all makes sense!

Was it helpful?

Solution

Not positive I follow what you're after, but if you don't want multiple records, you can eliminate the 2nd set of joins and just expand your JOIN criteria:

SELECT payments.payamount
      ,COALESCE(resorts1.resortname, '') AS rname  
FROM payments  
LEFT JOIN pupilbookings 
      ON payments.bookingcode= pupilbookings.bookingcode
LEFT JOIN lessons AS lessons1 
      ON   pupilbookings.lessonscode = lessons1.lessonscode
        OR pupilbookings.coursecode = lessons1.coursecode                       
LEFT JOIN resorts AS resorts1 
      ON lessons1.resortcode = resorts1.resortcode
WHERE paydate = ' & date_here & '  
GROUP BY payamount, resorts1.resortname
ORDER BY rname
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top