SELECT mx.Ticket_Closed_Date, mx.Interval, op.* FROM ( -- create a matrix containing all intervals from Tijdsintervallen and all dates & Event_Channels from Tussen_Tickets SELECT * FROM Tijdsintervallen CROSS JOIN ( SELECT DISTINCT Ticket_Closed_Date = CAST(Ticket_Closed_DateTime AS DATE) FROM Tussen_Tickets ) d CROSS JOIN ( SELECT DISTINCT Event_Channel FROM Tussen_Tickets ) e) mxOUTER APPLY ( SELECT tt.Event_Channel, DVBIntern = SUM(tt.DVBIntern), DVBExtern = SUM(tt.DVBExtern), Tijdsduur = SUM(tt.Tijdsduur), WrapUp = SUM(tt.WrapUp), OnHold = SUM(tt.OnHold), Talk = SUM(tt.Talk), RowsAggregated = COUNT(*) -- not in spec but handy to have FROM Tussen_Tickets tt CROSS APPLY ( SELECT Ticket_Closed_Time = CAST(tt.Ticket_Closed_DateTime AS TIME(3)), Ticket_Closed_Date = CAST(tt.Ticket_Closed_DateTime AS DATE) ) ta WHERE ta.Ticket_Closed_Time BETWEEN mx.beginTijdsinterval AND mx.eindTijdsinterval AND ta.Ticket_Closed_Date = mx.Ticket_Closed_Date AND tt.Event_Channel = mx.Event_Channel GROUP BY ta.Ticket_Closed_Date, tt.Event_Channel) opORDER BY mx.Ticket_Closed_Date, mx.Interval, op.Event_Channel;
SELECT *INTO #Matrix FROM Tijdsintervallen CROSS JOIN ( SELECT DISTINCT Ticket_Closed_Date = CAST(Ticket_Closed_DateTime AS DATE) FROM Tussen_Tickets) dCROSS JOIN ( SELECT DISTINCT Event_Channel FROM Tussen_Tickets) eCREATE UNIQUE CLUSTERED INDEX ucx_Everything ON #Matrix (Event_Channel, Ticket_Closed_Date, beginTijdsinterval)-----------------------------------------------------SELECT mx.Ticket_Closed_Date, mx.Interval, op.* FROM #Matrix mxOUTER APPLY ( SELECT tt.Event_Channel, DVBIntern = SUM(tt.DVBIntern), DVBExtern = SUM(tt.DVBExtern), Tijdsduur = SUM(tt.Tijdsduur), WrapUp = SUM(tt.WrapUp), OnHold = SUM(tt.OnHold), Talk = SUM(tt.Talk), RowsAggregated = COUNT(*) -- not in spec but handy to have FROM Tussen_Tickets tt CROSS APPLY ( SELECT Ticket_Closed_Time = CAST(tt.Ticket_Closed_DateTime AS TIME(3)), Ticket_Closed_Date = CAST(tt.Ticket_Closed_DateTime AS DATE) ) ta WHERE ta.Ticket_Closed_Time BETWEEN mx.beginTijdsinterval AND mx.eindTijdsinterval AND ta.Ticket_Closed_Date = mx.Ticket_Closed_Date AND tt.Event_Channel = mx.Event_Channel GROUP BY ta.Ticket_Closed_Date, tt.Event_Channel) opORDER BY mx.Ticket_Closed_Date, mx.Interval, op.Event_Channel;