sql как добавить недостающую неделю в таблицу

У меня есть table со следующими данными: дата when, о которой сообщили сотрудники, и неделя start-date(Monday) за эту неделю. Теперь они не работали все dates. Например нет данных за неделю christmas. Есть ли способ добавить недостающие week. Итак, у меня все еще будет неделя start-date для каждого week. Но report-date может быть нулевым.

Я не могу объявить variables

Это то, что у меня есть

введите здесь описание изображения

и это то, что я хочу добавить недостающую неделю

введите здесь описание изображения


person Nisha Nethani    schedule 10.02.2016    source источник
comment
непонятно, что вы спросили. Ваше требование - это запрос, который генерирует все даты начала недели в году?   -  person bmsqldev    schedule 10.02.2016
comment
Вам нужна таблица со всеми датами; затем вы можете LEFT JOIN tallytable в исходную таблицу.   -  person HoneyBadger    schedule 10.02.2016


Ответы (3)


Запрос SQLFIDDLEEXAMPLE:

CREATE TABLE tb 
    (
     d1 date, 
     d2 date
    );

INSERT INTO tb
(d1, d2)
VALUES
('2015-12-10', '2015-12-07'),
('2015-12-15', '2015-12-14'),
('2015-12-29', '2015-12-28'),
('2016-01-05', '2016-01-04');

SET DATEFIRST 1 

INSERT INTO tb
( d1, d2 )
select null, DATEADD(day,number,'2015-01-01')
FROM master..spt_values t1
LEFT JOIN tb t2
ON DATEADD(day,number,'2015-01-01') = t2.d2
WHERE type = 'P'
AND DATEADD(day,number,'2015-01-01') >= '2015-12-01'
AND DATEADD(day,number,'2015-01-01') <= '2016-01-04'
AND DATEPART(weekday,DATEADD(day,number,'2015-01-01')) = 1
AND t2.d2 is null

SELECT *
FROM tb

Результат:

|         d1 |         d2 |
|------------|------------|
| 2015-12-10 | 2015-12-07 |
| 2015-12-15 | 2015-12-14 |
| 2015-12-29 | 2015-12-28 |
| 2016-01-05 | 2016-01-04 |
|     (null) | 2015-12-21 |
person Justin    schedule 10.02.2016

Вы можете создать новую таблицу Календарь/Недели, содержащую все недели в году. Эта таблица должна быть заранее.

Затем вы можете сделать ссылку из таблицы данных на эту таблицу календаря (по идентификатору или неделе/году).

Ваш отчет должен быть основан на таблице календаря с внешним соединением с вашей таблицей данных.

Таким образом, ваш отчет будет содержать все недели, даже если по некоторым неделям нет данных.

РЕДАКТИРОВАТЬ: вам понадобится новая таблица, подобная этой:

Week:
| Start date | End date |
| 12/07/15   | 12/13/15 |
| 12/14/15   | 12/20/15 |
| 12/21/15   | 12/27/15 |
etc...
person pberggreen    schedule 10.02.2016
comment
ВЫБЕРИТЕ P.* из (выберите отдельную неделю_начала_даты из [проекта] объединение выберите отдельные AddDays (week_start_date, 7) из [проекта]) КАК W ВЛЕВО ПРИСОЕДИНЯЙТЕСЬ [проект] КАК P ON W.week_start_date = P.week_start_date - person Nisha Nethani; 10.02.2016
comment
Питер Берггрин, спасибо за ответ, но сколько лет я буду создавать этот календарь? - person Nisha Nethani; 10.02.2016
comment
Это будет не очень большая таблица, так что вы можете создать ее на несколько лет вперед, если не хотите. - person pberggreen; 10.02.2016

Предположим, что таблица #weekly_calendar содержит ваши действительные рабочие недели (т. е. на декабрь 2015 г.). Кстати, синтаксис для MSSQL. Вы должны указать, какую базу данных вы используете.

Вы также можете динамически создавать календарь во время выполнения. Это просто для того, чтобы показать концепцию в простой для понимания форме.

-- week start dates
-- 2015-12-01
-- 2015-12-07
-- 2015-12-14
-- 2015-12-21
-- 2015-12-28

create table #weekly_calendar (
    week_start_date datetime,
    week_end_date datetime
)

Предположим, что #report_date содержит дату отчета сотрудника.

-- report dates
-- 2015-12-02
-- 2015-12-15
-- 2015-12-29

create table #report_date (
    report_date datetime
)

Вот как вы отображаете незарегистрированные даты.

select * from #weekly_calendar w
left join #report_date r
on r.report_date between w.week_start_date and w.week_end_date

Если у вас нет week_end_date. Опять же, если ваши рабочие дни начинаются с понедельника по пятницу.

select * from #weekly_calendar w
left join #report_date r
on r.report_date between w.week_start_date and DATEADD(dd, 6-(DATEPART(dw, w.week_end_date)), w.week_end_date)

введите здесь описание изображения

person duduwe    schedule 10.02.2016