2017-02-10 6 views
0

2つのテーブルからクエリを作成しようとしています。たとえば、EmployeeとAppraisalです。これらのテーブルは両方とも1対多の関係を持っています。鑑定表には、従業員がAppraisalType列に応じて参加、再参加または退出するときの従業員の記録があります。SQLクエリからfromDateとtoDateを作成するには?

select dbo.Employee.EmployeeID 
     ,dbo.Employee.FullName 
     ,dbo.Employee.CostCenterID 
     ,ea.AppraisalDate as fromDate 
     , 
     (select case 
        when exists 
           (select 1 
           from 
            EmployeeAppraisal as EA2 
           where EA2.EmployeeID = Employee.EmployeeID 
             and EA2.AppraisalType = 'Exit' 
           having min(EA2.AppraisalDate) > EA.AppraisalDate 
           ) 
         then 
          (select min(AppraisalDate) 
          from 
            EmployeeAppraisal as EA2 
          where EA2.EmployeeID = EA.EmployeeID 
            and EA2.AppraisalType = 'Exit' 
          having min(EA2.AppraisalDate) > EA.AppraisalDate 
          ) 
        else getdate() 
       end 
     ) as ToDate 
     ,0 as MonthDiff 
     ,dbo.Employee.IsActive 
from 
    dbo.Employee 
    join EmployeeAppraisal as EA 
     on Employee.EmployeeID = EA.EmployeeID 
where EA.AppraisalType = 'Re-Joining' 
     and Employee.EmployeeId = 1253; 

そして、これは以下の結果を与える。実際のデータではあるが、それはすべての行

に同じ間違ったtoDateまでを与えている、日付がfromDateから、終了する必要があります再結合することはtoDateまででなければならないことに注意してください。どんな助けもありがたいです

です。

+1

ソースデータを 'create table ... insert into ...'スクリプトとして追加してください。私たちが実際にあなたを助けるために使用します。 – iamdave

答えて

0

これは、applyでかなり容易に達成できます。これらは、クエリ内の他のテーブルを参照できる点で、joinとは異なります。

declare @e table(EmployeeID int); 
insert into @e values(1253); 

declare @a table(EmployeeID int,AppraisalDate datetime,AppraisalType nvarchar(10)); 
insert into @a values 
(1253,'20140101','Exit') 
,(1253,'20140601','Re-Joining') 
,(1253,'20150101','Exit') 
,(1253,'20150601','Re-Joining') 
,(1253,'20160101','Exit') 
,(1253,'20160601','Re-Joining') 
,(1253,'20170101','Exit') 
,(1253,'20170601','Re-Joining') 
,(1253,'20180101','Exit'); 


select e.EmployeeID 
    ,f.AppraisalDate as FromDate 
    ,t.AppraisalDate as ToDate 
from @e e 
    join @a f 
     on e.EmployeeID = f.EmployeeID 
      and f.AppraisalType = 'Re-Joining' 
    outer apply (select top 1 AppraisalDate 
        from @a tt 
        where tt.EmployeeID = e.EmployeeID 
         and tt.AppraisalDate > f.AppraisalDate 
         and tt.AppraisalType = 'Exit' 
        order by tt.AppraisalDate 
       ) t; 

出力:この場合、私はAppraisalDateが、その後top 1order byで、最新のものを選択し、特定の行のRe-Joining日後であるExitレコードを保持するapplyにテーブルをフィルタリングしています:

+------------+-------------------------+-------------------------+ 
| EmployeeID |  FromDate   |   ToDate   | 
+------------+-------------------------+-------------------------+ 
|  1253 | 2014-06-01 00:00:00.000 | 2015-01-01 00:00:00.000 | 
|  1253 | 2015-06-01 00:00:00.000 | 2016-01-01 00:00:00.000 | 
|  1253 | 2016-06-01 00:00:00.000 | 2017-01-01 00:00:00.000 | 
|  1253 | 2017-06-01 00:00:00.000 | 2018-01-01 00:00:00.000 | 
+------------+-------------------------+-------------------------+ 
+0

優れたソリューション。ありがとうございました@ iamdaveあなたは私の日を救った:) – touseefkhan4pk

関連する問題