How I can group the results by day in this query with SQL Server?
SELECT d.IdDay, MIN(CASE WHEN isAnExtraHour = 0 THEN hour END) as 'Start Time', MAX(CASE WHEN isAnExtraHour = 0 THEN hour END) as 'End Time', MIN(CASE WHEN isAnExtraHour = 1 THEN hour END) as 'Start Extra Time', MAX(CASE WHEN isAnExtraHour = 1 THEN hour END) as 'End Extra Time'FROM Diary AS dLEFT JOIN DiaryTimetable AS dtON dt.IdDiary = d.IdDiaryWHERE userid = 1409GROUP BY d.IdDay
I use the code from @Quassnoi and I added this:
SELECT DATENAME(weekday, d.idday-1) as 'Day' , MIN(CASE WHEN isAnExtraHour = 0 THEN hour END) AS 'Start Time', MAX(CASE WHEN isAnExtraHour = 0 THEN hour END) AS 'End Time', MIN(CASE WHEN isAnExtraHour = 1 THEN hour END) AS 'Start Extra Time', MAX(CASE WHEN isAnExtraHour = 1 THEN hour END) AS 'End Extra Time'FROM Diary AS dLEFT JOIN DiaryTimetable AS dt ON dt.IdDiary = d.IdDiaryWHERE userid = 1409GROUP BY d.IdDay
I hope this help someone, thanks all for your answers.
The way I'd approach this would be to work out your standard and extra hours separately, something like this;
SELECT d.IdDay ,MIN(dt.StartTime) AS 'Start Time' ,MAX(dt.EndTime) AS 'End Time' ,MIN(ex.StartTime) AS 'Start Extra Time' ,MAX(ex.EndTime) AS 'End Extra Time'FROM Diary AS dLEFT JOIN ( SELECT IdDiary ,MIN(Hour) AS StartTime ,MAX(Hour) AS EndTime FROM DiaryTimetable GROUP BY IdDiary ) AS dt ON d.IdDiary = dt.IdDiary AND d.IsAnExtraHour = 0LEFT JOIN ( SELECT IdDiary ,MIN(Hour) AS StartTime ,MAX(Hour) AS EndTime FROM DiaryTimetable GROUP BY IdDiary ) AS ex ON d.IdDiary = ex.IdDiary AND d.IsAnExtraHour = 1WHERE userid = 1409GROUP BY d.IdDay