2017-01-03 2 views
0

У меня есть две таблицы, employee и employee time entry. Я выполнил запрос, который показывает мне всех сотрудников с суммой введенного времени или 0 как нулевое значение. В следующей колонке у меня есть номер недели. Если сотрудник не ввел время в течение недели, чем он дает мне 0, но он также дает мне нулевое значение на номере недели. как я могу заставить запрос показывать номер недели, предполагая, что сотрудник не сделал никакой записи.SQL, чтобы показать дату для значения Null на основе запроса

Select 
    Concat(Empfname,Emplname) as EmployeeName, 
    department, 
    iif (sum(whours) is null, 0, sum(whours)) CurrentHours, 
    Datepart (ww,wdate) WeekNum 
From 
    employee as e 
left outer join 
    TimeEntry as w on e.id = w.eId 
        and wdate between '01/01/2017' and '01/31/2017' 
group by 
    Concat(Empfname,Emplname), department, Datepart(ww, wdate) 

Выход

EmployeeName Department CurrentHours WeekNum 
------------------------------------------------ 
John Smith  Sales  8   1 
Smith John  Operations 0   Null 

Как я могу сказать, что это тоже из WEEKNUM 1?

Благодаря

+0

Если работник не сделал запись для времени, как вы узнаете, что она принадлежит неделе1? – GurV

+0

Какой номер недели вы хотели бы отобразить, если запись не была сделана? – Mureinik

+0

Вы можете использовать 'coalesce (Datepart (ww, wdate), 1)', если вы хотите, чтобы это было 1 incase, оно получилось null – GurV

ответ

0

Попробуйте это:

Select Concat(Empfname,Emplname) as EmployeeName, department 
iif (sum(whours) is null, 0, sum(whours)) CurrentHours 
ISNULL(Datepart (ww,wdate),1) WeekNum 

From employee as e left outer join TimeEntry as w on e.id=w.eId 
and wdate between '01/01/2017' and '01/31/2017' 

group by Concat(Empfname,Emplname), department, ISNULL(Datepart (ww,wdate),1) 

, которая заставит любого NULL значение, чтобы показать 1 вместо NULL сам

+0

Это будет работать очень хорошо на неделю 1. Как насчет того, когда я перейду на неделю 20? Тогда это может не сработать. – Invisible

+0

Но как вы могли определить, какой 'NULL' соответствует той неделе? – LONG

+0

Вот почему я тоже смущен. Я готовлю еженедельный отчет и просматриваю, в котором сотрудник не вошел в часы работы. Был надеется, что кто-то также столкнулся с этой проблемой и может решить ее. – Invisible

1

Идея заключается в том, чтобы создать все строки с помощью cross join, а затем использовать left join для введите строки, которые вы хотите, например:

Select Concat(e.Empfname, e.Emplname) as EmployeeName, e.department, 
     coalesce(sum(whours), 0) as CurrentHours 
     datepart(week, wd.wdate) as WeekNum 
from employee e cross join 
    (select distinct wdate from TimeEntry) wd left outer join 
    TimeEntry tw 
    on e.id = w.eId and tw.wdate = wd.wdate 
where wd.wdate between '2017-01-01' and '2017-01-31' 
group by Concat(e.Empfname, e.Emplname), e.department, Datepart(week, wd.wdate); 
+0

. Показывается только сотрудник, который вошел вовремя. Я хочу, чтобы все активные сотрудники из таблицы Employee. В таблице также есть неактивные сотрудники. – Invisible

+0

@ Невидимый. , , Это должно показать * всех * сотрудников. «Cross join» основан на всех сотрудниках, и нет другой фильтрации. –

Смежные вопросы