Как разделить запись на основе дат в SQL Server? - PullRequest
0 голосов
/ 09 октября 2018

У меня проблема с разделением диапазона дат, чтобы он стал тремя отдельными записями.

Например:

|Employee Id |   Name   | FirstReviewDate | SecondReviewDate|ThirdReviewDate| 
+------------+----------+-----------------+-----------------+---------------+
| 32018685A  |Alan Smith|    6/8/2000     |    9/15/2000    |   9/27/2000   |

Для результата я хочу это:

|Employee Id |   Name   |    DateType     | StartDate| EndDate  |
+------------+----------+-----------------+----------+----------+
| 32018685A  |Alan Smith| FirstReviewDate |6/8/2000  |6/8/2000  |
| 32018685A  |Alan Smith| SecondReviewDate|6/8/2000  |9/15/2000 |  
| 32018685A  |Alan Smith| ThirdReviewDate |9/15/2000 |9/27/2000 |    

Я попробовал общие утверждения CASE, но не сработало.Как мне этого добиться?

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Вы можете использовать cross apply.Если я правильно понимаю:

select e.Employee_Id, t.Name, v.DateType, v.StartDate, v.EndDate
from t cross apply
     (values ('FirstReviewDate', FirstReviewDate, FirstReviewDate),
             ('SecondReviewDate', FirstReviewDate, SecondReviewDate),
             ('ThirdReviewDate', SecondReviewDate, ThirdReviewDate)
     ) v(DateType, StartDate, EndDate);
0 голосов
/ 09 октября 2018

Я не на 100% уверен в том, как вы выводите даты начала и окончания там, но вы можете сделать это с помощью разворота:

 ;with src as
 (
    select 
        EmployeeId = '32018685A', 
        Name = 'Alan Smith', 
        FirstReviewDate = datefromparts(2000, 6, 8), 
        SecondReviewDate = datefromparts(2000, 9, 15), 
        ThirdReviewDate = datefromparts(2000, 9, 27)
), upvt as
(
    select 
        EmployeeId,
        Name,
        DataType,
        EndDate
    from src s
    unpivot 
    (
        EndDate for DataType in 
        (
            FirstReviewDate, 
            SecondReviewDate, 
            ThirdReviewDate
        )
    ) p
)
select
    EmployeeId,
    Name,
    DataType,
    StartDate = isnull(lag(EndDate, 1, null) over (order by DataType), EndDate),
    EndDate

from upvt
0 голосов
/ 09 октября 2018

Я бы использовал apply с lag():

select t.EmployeeId, t.Name, 
       lag(dates, 1, dates) over (partition by EmployeeId order by dates) as StartDate, dates as EndDate  
from table t cross apply
     ( values ('FirstReviewDate', FirstReviewDate), ('SecondReviewDate', SecondReviewDate), ('ThirdReviewDate', ThirdReviewDate)
     ) tt(DateType, dates);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...