Our fleet drivers accumulate hours in each type of rig that we operate.
This first query returns a list of driver IDs for a given route.
declare @day int = 14689; -- Today's "day" (# of days from 1/1/1980) declare @dep varchar(3) = 'BXBU'; declare @carrier int = 1; declare @flt int = 703; declare @legcd char(1) = ''; SELECT r.DRIVER_ID FROM ROSTER r JOIN CRROUTE cr ON (cr.CDATE = r.DUTYDAY and cr.CROUTE = r.DUTYNO) JOIN CrewLeg cl on (cl.CDATE = cr.CDATE and cl.croute = cr.CROUTE and cl.DAY = r.LEG_DAY and cl.DEP = r.LEG_DEP and cl.CARRIER = r.LEG_CARRIER and cl.flt = r.LEG_FLT and cl.LEGCD = r.LEG_LEGCD) WHERE r.leg_day = @day AND r.leg_dep = @dep AND r.leg_CARRIER = @carrier AND r.leg_flt = @flt AND r.leg_legcd = @legcd AND r.POS <= 2 GROUP BY r.ID,r.leg_day, r.leg_carrier, r.leg_flt, r.leg_legcd
Result:
1109 1209 1310
I need to feed these IDs into this second query, which returns the number of accumulated hours for a given Driver ID.
SELECT SUM(LT.BLON - LT.BLOF) as 'HOURSINTYPE' FROM ROSTER R INNER JOIN CREWLEG CL on R.LEG_DAY = CL.DAY AND R.LEG_CARRIER = CL.CARRIER AND R.LEG_FLT = CL.FLT AND R.LEG_DEP = CL.DEP AND R.LEG_LEGCD = CL.LEGCD AND R.DUTYDAY = CL.CDATE AND R.DUTYNO = CL.CROUTE INNER JOIN LEGMAIN LM on R.LEG_DAY = LM.DAY AND R.LEG_CARRIER = LM.CARRIER AND R.LEG_FLT = LM.FLT AND R.LEG_DEP = LM.DEP AND R.LEG_LEGCD = LM.LEGCD INNER JOIN LEGTIMES LT on R.LEG_DAY = LT.DAY AND R.LEG_CARRIER = LT.CARRIER AND R.LEG_FLT = LT.FLT AND R.LEG_DEP = LT.DEP AND R.LEG_LEGCD = LT.LEGCD WHERE R.Driver_ID = {{Each_ID_From_1st_Query}} AND LEG_DAY <= @day AND PAX = 0 AND R.LEG_FLT > 0 AND LT.BLON != 0 AND LM.AC IN(8,10)
I’m trying to achieve:
ID Hours ----- ----- 1109 109 1209 530 1310 76
EDIT: For clarification, if it helps, both queries join the ROSTER table to a different set of joined tables. The ID is in the ROSTER table in both queries. The first query selects the IDs, but the second query needs to use those IDs.
Both queries work fine independently of each other if I manually supply the specific ID I want for the second query.
I know how to do this with a cursor, but I know there must be some way to do this in a JOIN.
I tried several approaches:
WITH cte1 AS ( FIRST QUERY ), cte2 AS ( SECOND QUERY ) SELECT -- uhm.... what? I can't get the ID from cte1 into cte2.
And I tried various incarnation of:
(FIRST QUERY) a JOIN (SECOND QUERY) b WHERE a.Driver_ID = b.Driver_ID
But could never quite get the syntax to work.
I do not have access to modify the database in any way, so I cannot create VIEWs to do this.
This question is very similar to what I am trying to do, but it received no answer:
SQL Server – Join results of one query to first matching result from second query
Advertisement
Answer
You should be able to use an IN
expression to use the results from the first query in the second. For example, using a CTE
:
declare @day int = 14689; -- Today's "day" (# of days from 1/1/1980) declare @dep varchar(3) = 'BXBU'; declare @carrier int = 1; declare @flt int = 703; declare @legcd char(1) = ''; WITH CTE AS ( SELECT r.DRIVER_ID FROM ROSTER r JOIN CRROUTE cr ON (cr.CDATE = r.DUTYDAY and cr.CROUTE = r.DUTYNO) JOIN CrewLeg cl on (cl.CDATE = cr.CDATE and cl.croute = cr.CROUTE and cl.DAY = r.LEG_DAY and cl.DEP = r.LEG_DEP and cl.CARRIER = r.LEG_CARRIER and cl.flt = r.LEG_FLT and cl.LEGCD = r.LEG_LEGCD) WHERE r.leg_day = @day AND r.leg_dep = @dep AND r.leg_CARRIER = @carrier AND r.leg_flt = @flt AND r.leg_legcd = @legcd AND r.POS <= 2 GROUP BY r.ID,r.leg_day, r.leg_carrier, r.leg_flt, r.leg_legcd ) SELECT R.Driver_ID, SUM(LT.BLON - LT.BLOF) as 'HOURSINTYPE' FROM ROSTER R INNER JOIN CREWLEG CL on R.LEG_DAY = CL.DAY AND R.LEG_CARRIER = CL.CARRIER AND R.LEG_FLT = CL.FLT AND R.LEG_DEP = CL.DEP AND R.LEG_LEGCD = CL.LEGCD AND R.DUTYDAY = CL.CDATE AND R.DUTYNO = CL.CROUTE INNER JOIN LEGMAIN LM on R.LEG_DAY = LM.DAY AND R.LEG_CARRIER = LM.CARRIER AND R.LEG_FLT = LM.FLT AND R.LEG_DEP = LM.DEP AND R.LEG_LEGCD = LM.LEGCD INNER JOIN LEGTIMES LT on R.LEG_DAY = LT.DAY AND R.LEG_CARRIER = LT.CARRIER AND R.LEG_FLT = LT.FLT AND R.LEG_DEP = LT.DEP AND R.LEG_LEGCD = LT.LEGCD WHERE R.Driver_ID IN (SELECT DRIVER_ID FROM CTE) AND LEG_DAY <= @day AND PAX = 0 AND R.LEG_FLT > 0 AND LT.BLON != 0 AND LM.AC IN(8,10) GROUP BY R.Driver_ID