2017-05-12 81 views
2

如何在sql server中填入缺失日期相关数据与以前的日期相关数据?在SQL Server中填入缺失日期与以前的日期

表:EMP

CREATE TABLE [dbo].[emp](
    [empid] [int] NULL, 
    [doj] [date] NULL, 
    [deptid] [int] NULL, 
    [ename] [varchar](50) NULL, 
    [sal] [int] NULL 
) 
INSERT [dbo].[emp] ([empid], [doj], [deptid], [ename], [sal]) VALUES (1, CAST(N'2017-01-02' AS Date), 10, N'ravi', 100) 
GO 
INSERT [dbo].[emp] ([empid], [doj], [deptid], [ename], [sal]) VALUES (1, CAST(N'2017-01-05' AS Date), 10, N'ravi', 200) 
GO 
INSERT [dbo].[emp] ([empid], [doj], [deptid], [ename], [sal]) VALUES (2, CAST(N'2017-01-08' AS Date), 20, N'banu', 300) 
GO 
INSERT [dbo].[emp] ([empid], [doj], [deptid], [ename], [sal]) VALUES (2, CAST(N'2017-01-07' AS Date), 20, N'banu', 250) 
GO 
INSERT [dbo].[emp] ([empid], [doj], [deptid], [ename], [sal]) VALUES (3, CAST(N'2017-01-10' AS Date), 30, N'jai', 400) 
GO 

基于以上数据我要像数据下

empid |doj  |deptid |ename |sal 
    1 |2017-01-02 |10  |ravi  |100 
    1 |2017-01-03 |10  |ravi  |100-----missing dates required 
    1 |2017-01-04 |10  |ravi  |100-----missing dates required 
    1 |2017-01-05 |10  |ravi  |200 
    1 |2017-01-06 |10  |ravi  |200-----missing dates required 
    2 |2017-01-07 |20  |banu  |250 
    2 |2017-01-08 |20  |banu  |300 
    2 |2017-01-09 |20  |banu  |300-----missing dates required 
    3 |2017-01-10 |30  |jai  |400 

我如何编写一个查询,以实现在SQL Server这项任务?

+0

您能更具体地说明“缺少数据相关数据”吗? –

回答

1

我不知道我完全理解你的标准在这里(我最初期待某种划分的基础上如empid),但这似乎做的工作:

declare @emp table (
    [empid] [int] NULL, 
    [doj] [date] NULL, 
    [deptid] [int] NULL, 
    [ename] [varchar](50) NULL, 
    [sal] [int] NULL 
) 
INSERT @emp ([empid], [doj], [deptid], [ename], [sal]) VALUES 
(1, CAST(N'2017-01-02' AS Date), 10, N'ravi', 100), 
(1, CAST(N'2017-01-05' AS Date), 10, N'ravi', 200), 
(2, CAST(N'2017-01-08' AS Date), 20, N'banu', 300), 
(2, CAST(N'2017-01-07' AS Date), 20, N'banu', 250), 
(3, CAST(N'2017-01-10' AS Date), 30, N'jai', 400) 

;With Fillers as (
    select * from @emp 
    union all 
    select empid,DATEADD(day,1,doj),deptid,ename,sal 
    from Fillers e 
    where not exists (select * from @emp e2 where e2.doj = DATEADD(day,1,e.doj)) and 
    exists (select * from @emp e3 where e3.doj > e.doj) 
) 
select * from Fillers 
order by doj 

结果:

empid  doj  deptid  ename   sal 
----------- ---------- ----------- ---------------- ----------- 
1   2017-01-02 10   ravi    100 
1   2017-01-03 10   ravi    100 
1   2017-01-04 10   ravi    100 
1   2017-01-05 10   ravi    200 
1   2017-01-06 10   ravi    200 
2   2017-01-07 20   banu    250 
2   2017-01-08 20   banu    300 
2   2017-01-09 20   banu    300 
3   2017-01-10 30   jai    400 

希望递归CTE是相对可读的 - 如果在特定日期没有当前行(e2),并且至少有一行表示执行的总体终点,我们会添加更多行以填补空白填(e3)。

0

您可以使用递归CTE。 (如果会有更多的行,请使用maxrecursion选项:))

CREATE TABLE [dbo].[emp](
    [empid] [int] NULL, 
    [doj] [date] NULL, 
    [deptid] [int] NULL, 
    [ename] [varchar](50) NULL, 
    [sal] [int] NULL 
) 
INSERT [dbo].[emp] ([empid], [doj], [deptid], [ename], [sal]) VALUES (1, CAST(N'2017-01-02' AS Date), 10, N'ravi', 100) 
GO 
INSERT [dbo].[emp] ([empid], [doj], [deptid], [ename], [sal]) VALUES (1, CAST(N'2017-01-05' AS Date), 10, N'ravi', 200) 
GO 
INSERT [dbo].[emp] ([empid], [doj], [deptid], [ename], [sal]) VALUES (2, CAST(N'2017-01-08' AS Date), 20, N'banu', 300) 
GO 
INSERT [dbo].[emp] ([empid], [doj], [deptid], [ename], [sal]) VALUES (2, CAST(N'2017-01-07' AS Date), 20, N'banu', 250) 
GO 
INSERT [dbo].[emp] ([empid], [doj], [deptid], [ename], [sal]) VALUES (3, CAST(N'2017-01-10' AS Date), 30, N'jai', 400) 
GO 

IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmp 
SELECT * , ROW_NUMBER() OVER (ORDER BY doj) RN 
INTO #tmp 
FROM dbo.emp  

;WITH CTE AS (
      SELECT empid, deptid,ename,sal, doj,RN 
      FROM #tmp 
      UNION ALL 
      SELECT a.empid, a.deptid,a.ename,a.sal, DATEADD(DAY,+1,a.doj),a.RN 
      FROM CTE a 
      JOIN #tmp b ON a.RN+1 = b.RN 
      WHERE DATEADD(DAY,+1,a.doj) != b.doj 
      ) 

SELECT * 
FROM CTE 
ORDER BY CTE.doj