Reputation: 21
I have a table and I have users with dates...
| Employee_Name | Date |
| CG | 2019-04-22 |
| CG | 2019-04-26 |
| CG | 2019-04-24 |
I am trying to get results so when I query and say Date BETWEEN (@start AND @end)
it would give me results like:
EMPLOYEE_NAME | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday |
CG | 2019-04-22 | NULL | 2019-04-24 | NULL | 2019-04-26 | NULL | NULL |
I am at a loss scratching my head honestly - I know i may be able to do it with a pivot.
Upvotes: 0
Views: 72
Reputation: 2009
Here is the Pivot solution.
I added more sample data (one more employee and two dates) to test it out:
declare @weekday table (weekday varchar(10))
insert into @weekday (weekday) values
('Monday'),
('Tuesday'),
('Wednesday'),
('Thursday'),
('Friday'),
('Saturday'),
('Sunday')
select p.employee_name,[Monday],[Tuesday],[Wednesday],[Thursday],[Friday],[Saturday],[Sunday]
from (
select t.employee_name,t.date,w.weekday from (
select *, datename(weekday,date) as weekday
from #test) t
right join @weekday w
on w.weekday = t.weekday) s
pivot
(max(date)
for weekday in ([Monday],[Tuesday],[Wednesday],[Thursday],[Friday],[Saturday],[Sunday])
) as p
where p.employee_name is not null
Please change the table_name accordingly. (I used #test)
Test Result:
Upvotes: 0
Reputation: 272096
The following should work (perfectly if @d2 - @d1 < 7 otherwise it'll display the first date for each weekday):
SELECT Employee_Name
, MIN(CASE WHEN DATENAME(dw, Date) = 'Sunday' THEN Date END) AS Sunday
, MIN(CASE WHEN DATENAME(dw, Date) = 'Monday' THEN Date END) AS Monday
, MIN(CASE WHEN DATENAME(dw, Date) = 'Tuesday' THEN Date END) AS Tuesday
, MIN(CASE WHEN DATENAME(dw, Date) = 'Wednesday' THEN Date END) AS Wednesday
, MIN(CASE WHEN DATENAME(dw, Date) = 'Thursday' THEN Date END) AS Thursday
, MIN(CASE WHEN DATENAME(dw, Date) = 'Friday' THEN Date END) AS Friday
, MIN(CASE WHEN DATENAME(dw, Date) = 'Saturday' THEN Date END) AS Saturday
FROM t
WHERE Date BETWEEN @d1 AND @d2
GROUP BY Employee_Name
Upvotes: 2