2016-08-25 15 views
2

私が必要とするものを正確に得ることができません。ここに私のテーブルの例は以下のとおりです。SQL日付範囲の日付が含まれていないレコードを選択する

Plan_ID | PlanBeginDate | PlanEndDate | 
    1 | 1/1/2015 | 1/1/2016 | 
    2 | 1/1/2016 | 1/1/2017 | 
    3 | 1/1/2013 | 1/1/2014 | 
    4 | 1/1/2015 | 1/1/2016 | 

SrvID | Srv_Plan_ID | Srv_Discipline_ID | SrvBeginDate | SrvEndDate | 
    1 |  1  |  1   | 1/1/2015 | 1/1/2016 | 
    2 |  1  |  3   | 1/1/2015 | 1/1/2016 | 
    3 |  2  |  2   | 1/1/2016 | 4/4/2016 | 
    4 |  2  |  2   | 4/5/2016 | 1/1/2017 | 
    5 |  3  |  1   | 1/1/2013 | 6/1/2013 | 
    6 |  3  |  2   | 1/1/2013 | 1/1/2014 | 
    7 |  4  |  3   | 1/1/2015 | 7/1/2016 | 
    8 |  4  |  3   | 8/1/2015 | 1/1/2016 | 

私はそれに関連して、各個別の規律のためのサービス日付でカバーされていない日付を持っているすべてのプランを見るために探しています。

プラン1は、それに関連する両方の分野がすべての日付をカバーするので、表示しないでください。

2つの関連サービスが同じ規律を持ち、計画期間全体をカバーしているため、プラン2は表示されません。

SrvID 5が計画期間全体をカバーしていないため、Plan 3が一度表示されます。

規律3の7月が明らかになったため、プラン4が表示されます。

上記の基準に従って、次のフィールドを返すselect文が必要です。

Plan_ID | PlanBeginDate | PlanEndDate |Srv_Discipline_ID | SrvBeginDate | SrvEndDate | 

ここまでは、これまでの内容です。

Select Plan_ID, Srv_Discipline_ID, PlanBeginningDate, PlanEndDate, MIN(SrvBeginDate) EarliestStartDate, MAX(SrvEndDate) LatestEndDate 
From dbo.Plan 
JOIN Services 
    ON Plan_ID = Srv_Plan_ID 
GROUP BY Plan_ID, Srv_Discipline_ID, PlanBeginDate, PlanEndDate 
ORDER BY Plan_ID 
+2

まず

with ServiceCTE as ( select Srv_Plan_ID, Srv_Discipline_ID, SrvEndDate, SrvBeginDate as SrvDate from Services union all select Srv_Plan_ID, Srv_Discipline_ID, SrvEndDate, dateadd(day, 1, SrvDate) as SrvDate from ServiceCTE where SrvDate != SrvEndDate ), PlanCTE as ( select Plan_ID, PlanEndDate, PlanBeginDate as PlanDate from Plans union all select Plan_ID, PlanEndDate, dateadd(day, 1, PlanDate) as PlanDate from PlanCTE where PlanDate != PlanEndDate ), UncoveredPlanDisciplineCTE as ( select distinct pcte.Plan_ID, s.Srv_Discipline_ID from PlanCTE pcte join (select distinct Srv_Plan_ID, Srv_Discipline_ID from Services) s on s.Srv_Plan_ID = pcte.Plan_ID where not exists (select null from ServiceCTE scte where scte.Srv_Plan_ID = s.Srv_Plan_ID and scte.Srv_Discipline_ID = s.Srv_Discipline_ID and scte.SrvDate = pcte.PlanDate) ) select p.Plan_ID, p.PlanBeginDate, p.PlanEndDate, s.Srv_Discipline_ID, s.SrvBeginDate, s.SrvEndDate from UncoveredPlanDisciplineCTE c join Plans p on p.Plan_ID = c.Plan_ID join Services s on s.Srv_Plan_ID = c.Plan_ID and s.Srv_Discipline_ID = c.Srv_Discipline_ID order by p.Plan_ID, s.Srv_Discipline_ID, s.SrvBeginDate option (maxrecursion 0) 

結果、それはMySQLやSQL-Serverです。第二に、何を試しましたか? – user3741598

+0

大変申し訳ございません!これはSQL Serverです。 私はこのサイトを初めて利用しています。私の元の投稿に私の質問を編集します。 –

+0

あなたが私たちに提示している質問はあなたの質問に関連していないようです。表示される表と一致する列名はありません。 –

答えて

0

私はこれを行うための一つの方法を考え出したが、それはに対して結合することができ、個々の日に日付の範囲を拡大するために高価な再帰CTEを必要とします。だから、明確にするために、このクエリではパフォーマンスが非常に良いとは思っていません。

注:私が使用したテストデータでSrvID = 7の値が7/1/2016から7/1/2015に固定されています。それはあなたが7月の月が明らかになったと言ったときのあなたの意図だったに違いない。

セットアップ

create table Plans (
    Plan_ID int not null primary key, 
    PlanBeginDate date not null, 
    PlanEndDate date not null 
) 

create table Services (
    SrvID int not null primary key, 
    Srv_Plan_ID int not null, 
    Srv_Discipline_ID int not null, 
    SrvBeginDate date not null, 
    SrvEndDate date not null 
) 

alter table Services 
add constraint Services_fk 
foreign key (Srv_Plan_ID) 
references Plans(Plan_ID) 

insert into Plans (Plan_ID, PlanBeginDate, PlanEndDate) 
values 
(1, '2015-01-01', '2016-01-01'), 
(2, '2016-01-01', '2017-01-01'), 
(3, '2013-01-01', '2014-01-01'), 
(4, '2015-01-01', '2016-01-01') 

insert into Services (SrvID, Srv_Plan_ID, Srv_Discipline_ID, SrvBeginDate, SrvEndDate) 
values 
(1, 1, 1, '2015-01-01', '2016-01-01'), 
(2, 1, 3, '2015-01-01', '2016-01-01'), 
(3, 2, 2, '2016-01-01', '2016-04-04'), 
(4, 2, 2, '2016-04-05', '2017-01-01'), 
(5, 3, 1, '2013-01-01', '2013-06-01'), 
(6, 3, 2, '2013-01-01', '2014-01-01'), 
(7, 4, 3, '2015-01-01', '2015-07-01'), 
(8, 4, 3, '2015-08-01', '2016-01-01') 

クエリ

Plan_ID PlanBeginDate PlanEndDate Srv_Discipline_ID SrvBeginDate SrvEndDate 
------- ------------- ----------- ----------------- ------------ ---------- 
    3  2013-01-01  2014-01-01   1   2013-01-01 2013-06-01 
    4  2015-01-01  2016-01-01   3   2015-01-01 2015-07-01 
    4  2015-01-01  2016-01-01   3   2015-08-01 2016-01-01 
関連する問題