This is quite complex, but I'm gonna give it a try :) You can probably do this in two ways (without using a temporary table, that is). 1. If you're fine with the result being shown vertically: SELECT CLASS, DATENAME([month], RSRVDATE) AS Month, COUNT(*) AS Total FROM RESERVED_LEGS INNER JOIN Tickets_Purchased ON RESERVED_LEGS.PNR = Tickets_Purchased.TKTNO GROUP BY CLASS, MONTH(RSRVDATE) ORDER BY CLASS, MONTH(RSRVDATE) This should return something like: CLASS Month Total First January 100 First February 150 ... 2. If you want the result to be shown horizontally (this is more difficult): SELECT CLASS, (SELECT COUNT(*) FROM RESERVED_LEGS INNER JOIN Tickets_Purchased AS TP ON RESERVED_LEGS.PNR = TP.TKTNO WHERE MONTH(RSRVDATE) = 1) AND TP.CLASS = TicketsPurchased.CLASS) AS Jan, (SELECT COUNT(*) FROM RESERVED_LEGS INNER JOIN Tickets_Purchased AS TP ON RESERVED_LEGS.PNR = TP.TKTNO WHERE MONTH(RSRVDATE) = 2) AND TP.CLASS = TicketsPurchased.CLASS) AS Feb, (SELECT COUNT(*) FROM RESERVED_LEGS INNER JOIN Tickets_Purchased AS TP ON RESERVED_LEGS.PNR = TP.TKTNO WHERE MONTH(RSRVDATE) = 3) AND TP.CLASS = TicketsPurchased.CLASS) AS Mar, ... ... ... FROM Tickets_Purchased GROUP BY CLASS ORDER BY CLASS You can always use the query from #1 and format it to present it the way you want it to be, as I think it will be the most efficient query from both. I hope it helps ;) PS: You might want to tweak the SQL queries a bit to make it work :) PPS: Maybe there is a more efficient way to do #2. Anyone? Edbert P. Sydney, Australia.