2010-05-19 1 views
2

Ну у меня это -Написать SQL запрос, чтобы заменить значения и включают в себя все даты

Table DimDate- Date 
Table Employee- Id,Name,Points,Date 

Теперь таблица Employee имеет очки для повседневного, если они не пришли ... так что дата не все записи Dates ... Я имею в виду, например, через неделю он не приходил в течение 2 дней, таблица Employee имеет всего 5 строк ... поэтому у меня есть эта таблица dimdate, в которой есть все даты до 2050 года, с которыми я хочу присоединиться, и добавьте Zeros для дат, когда у него нет очков. Поэтому я написал этот запрос, но не работает -

Select E.EmployeeId,D.Date,isNull(E.Points,0) from DimDate D left join Employee E on D.Date between '01-01-2009'and '06-01-2009' where E.EmployeeId=1 

выше запроса дать несколько дат, и я попытался группу, на сегодняшний день, но не работает.

+0

Таким образом, [Date] является первичным ключом 'DimDate' таблице и эта таблица имеет только даты (не даты и времени), верный? Может ли строка Employee иметь несколько строк в разные дни? – Thomas

+0

Ну, на самом деле dimdate имеет другие поля, но я пропустил это ... но ya поле Date имеет уникальные значения Date и time ... и ни один сотрудник не имеет повторяющихся строк для даты .. будет ли сравнивать даты и время давать проблемы? – Vishal

ответ

3

Возможно, вы не хотите присоединяться к двум таблицам в диапазоне дат, кроме даты. Затем отфильтруйте запись, установленную диапазоном дат. Пример

Select 
    E.EmployeeId, 
    D.Date, 
    isNull(E.Points,0) 
from DimDate D 
left join Employee E on D.Date = E.Date 
where E.EmployeeId=1 
    AND D.Date Between '01-01-2009'and '06-01-2009' 

Отредактировано:

Select 
    E.EmployeeId, 
    D.Date, 
    isNull(E.Points,0) 
from DimDate D 
left join Employee E on D.Date = E.Date And E.EmployeeId=1 
where D.Date Between '01-01-2009'and '06-01-2009' 

ИЛИ

Select 
    E.EmployeeId, 
    D.Date, 
    isNull(E.Points,0) 
from DimDate D 
left join Employee E on D.Date = E.Date 
where (E.EmployeeId = 1 OR E.EmployeeId is NULL) 
    AND D.Date Between '01-01-2009'and '06-01-2009' 
+0

Ya..I получил мой prb, но он до сих пор не возвращает мне записи до даты окончания ... он возвращает мне только даты, которые присутствуют в таблице Employee. Так что он возвращает меня только до '04 -01-2010 '. .i Угадайте, потому что я присоединяюсь к Дате, но не должен оставлять внешнее соединение, беру все первые таблицы. ..? – Vishal

+0

Проверьте, что я добавил выше –

2

Я думаю, вам нужно перекрестное соединение между таблицей dimdates и таблицей, где указаны ваши сотрудники. Это даст вам список записей со всеми комбинациями сотрудников/дат. Тогда результат этого должен быть оставлен внешним, соединенным с таблицей, в которой записаны записи о сотрудниках.

Что-то вроде:

Select CJ.EmployeeId,CJ.Date,isNull(E.Points,0) 
    from (SELECT EmployeeID, D.Date 
      from DimDate D CROSS JOIN [EmployeeDefinitionTable] as edt) as CJ 
     left outer join Employee E on CJ.Date =E.Date AND CJ.EmployeeId = E.EmployeeId 
where CJ.Date between '01-01-2009'and '06-01-2009' 
    and E.EmployeeId = 1 

Где EmployeeDefinitionTable представляет собой таблицу, которая уникально список всех сотрудников (или, по крайней мере, их идентификаторы для данной постановки задачи).

Это также фиксирует сотрудников, не имеющих точек.

Между заявлением и/или фильтрацией EmployeeId можно переместить в перекрестное соединение, если оно соответствует вашим требованиям. Это сделало бы крест более эффективным.