SQL - 创建用于将NULL填入缺少日期但重复ID列值的行

时间:2014-06-19 15:30:00

标签: sql sql-server date row fill

我有以下表格。一个人拥有TimeRegister每个员工(每行等于IN和asc序列中的OUT):

Employee         TimeRegister
   15        2014-04-01 11:51:43.000
   15        2014-04-01 14:03:52.000
   15        2014-04-01 14:17:01.000
   15        2014-04-01 16:01:12.000
   15        2014-04-03 09:48:33.000
   15        2014-04-03 12:13:43.000

另一张桌子有所有日期:

          Date
2014-04-01 00:00:00.000
2014-04-02 00:00:00.000
2014-04-03 00:00:00.000
2014-04-04 00:00:00.000  

正如您在第一张表中所注意到的那样,2014-04-02的员工15没有记录。但我希望这个日期带有NULL时间寄存器,所以看起来像这样:

Employee         TimeRegister
   15        2014-04-01 11:51:43.000
   15        2014-04-01 14:03:52.000
   15        2014-04-01 14:17:01.000
   15        2014-04-01 16:01:12.000
   15                NULL
   15        2014-04-03 09:48:33.000
   15        2014-04-03 12:13:43.000  

我不希望INSERT进入表格本身,而是使用VIEW来获取此值。

所有帮助将不胜感激。提前致谢!

4 个答案:

答案 0 :(得分:3)

我使用递归cte来生成范围的所有日期,但如果你说你有另一个包含所有日期(或所有相关/工作日期)的表,请使用它而不是{{1} }。同样,我从cteDateGen的同一个表中删除了独特的员工 - 再次,您可能有另一个员工表。获得所有日期和员工的列表后,即使表中没有这样的行,也可以使用TimeRegister将左外连接到表中,以确保每个日期/员工组合至少有一行: / p>

TimeRegister

我假设与小提琴here

中的表结构相同

答案 1 :(得分:0)

这不完美(它给员工的空值而不是日期,只有年/月/日的比较是粗略的!)

select Employee, coalesce(TimeRegister, Date)
from Date
left outer join EmpDate 
  on left(cast(Date as nvarchar), 10) = left(cast(TimeRegister as nvarchar), 10)

即。给出:

EMPLOYEE    COLUMN_1 
15          April, 01 2014 11:51:43+0000
15          April, 01 2014 14:03:52+0000 
15          April, 01 2014 14:17:01+0000
15          April, 01 2014 16:01:12+0000
(null)      April, 02 2014 00:00:00+0000
15          April, 03 2014 09:48:33+0000 
15          April, 03 2014 12:13:43+0000 
(null)      April, 04 2014 00:00:00+0000

SQL小提琴链接:http://sqlfiddle.com/#!3/482b1/7/0

答案 2 :(得分:0)

数据库设计似乎有点破碎了你需要的东西。这将获得NULL日期,但也是NULL员工。

SELECT  T.Employee, T.TimeRegister
FROM    DateTable D
LEFT JOIN   TimeRegisterTable T
        ON  convert(date,T.TimeRegister) = convert(date,D.Date)

答案 3 :(得分:0)

尝试此查询,假设您的第一个表名为a1,第二个表名为a2:

select a.Employee,b.TimeRegister from a1 a 
    inner join a2 b on a.TimeRegister=b.TimeRegister
union
select x.Employee,null
from a1 x
where x.Employee not in (select d.Employee from a1 d 
    inner join a2 e on d.TimeRegister=e.TimeRegister
    where d.Employee=null)

输出:

15  2014-04-01 11:51:43.000
15  2014-04-01 14:03:52.000
15  2014-04-01 14:17:01.000
15  2014-04-01 16:01:12.000
15  2014-04-03 09:48:33.000
15  2014-04-03 12:13:43.000
15  NULL