我有一个table
,其中包含以下数据:员工报告的日期when
和该周的start-date(Monday)
周。现在他们没有全部工作dates
。例如,christmas
周没有数据。有没有办法可以添加丢失的week
。因此,对于每个start-date
,我仍然会有week
周。但report-date
可以为空。
我无法声明variables
这就是我所拥有的
这就是我想要添加缺失的一周
答案 0 :(得分:1)
查询 的 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 |
答案 1 :(得分:0)
您可以创建一个新的日历/周表,其中包含一年中的所有周。该表应该提前。
然后,您可以从数据表中引用此日历表(按ID或周/年)。
您的报告应基于日历表,并在数据表中添加外部联接。
这样,即使几周内没有任何数据,您的报告也会包含所有周数。
编辑:你需要一个像这样的新表:
Week:
| Start date | End date |
| 12/07/15 | 12/13/15 |
| 12/14/15 | 12/20/15 |
| 12/21/15 | 12/27/15 |
etc...
答案 2 :(得分:0)
假设#weekly_calendar
表包含您的有效工作周(即2015年12月)。顺便说一下,语法适用于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)