2017-05-12 35 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)の現在の行がない場合はギャップを埋めるためにさらに多くの行を追加し、パフォーマンスの全体的なエンドポイントを表す少なくとも1つの行がある埋めるing-in(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 
関連する問題