T-SQL разбивает строку с тремя наборами данных с разными эффективными датами на три строки

У меня есть файл (а не мой дизайн!), Исходящий из системы HR с несколькими полями в ней, а разные наборы полей имеют разные Даты вступления в силу. Я не знаю трех полей, которые будут старше или новее дат. Я упростил количество полей, но принцип:

rec# EmpNmbr Store  StorEffDate Part  PT Eff        EmpGrp  EmpGrp
                                Time   Date                 Eff Date                                
1    90122   T202   03/07/2018   X    26/07/2018    Summary 01/07/2018    
2    90122   LR86   13/08/2018        20/07/2018    Regular 14/08/2018    
3    90122   T707   11/10/2018   X    03/09/2018    Summary 12/09/2018

Например, мне нужно разбить запись 1, чтобы было 3 записи:

Эффективные даты и данные:

01/07/2012 по 02/07/2018 с EmpGrp = Сводка и Parttime and Store имеют значение null (я получу фактические данные из того, что в настоящее время активно 01/07/2018).

03/07/2018 to 25/07/2018 with Store = T202, EmpGrp = Summary, and Parttime null.    
26/07/2018 to 01/01/3000 with Store = T202, EmpGrp = Summary, and Parttime=X

Затем из записи 2 мне понадобится:

20/07/2018 to 12/08/2018  T202 (from record above), Parttime=''and EmpGrp = Summary    
13/08/2018 to 13/08/2018 LR86, Parttime=''and EmpGrp = Summary    
14/08/2018 to 01/01/3000 LR86, Parttime=''and EmpGrp = Regular

и т.д

Надеюсь, это ясно, но мне нужно иметь возможность сделать это, чтобы разделить каждую запись на 3 и упорядочить их в порядке даты одним из трех эффективных по дате полей и связать отдельные поля данных с его эффективным полем.

sql,sql-server,

0

Ответов: 1


0

nycoy, вы должны объяснить свою логику «расщепления» строки на несколько (2 или 3). Не зная логики, основываясь на предоставленной выборке и ожидаемом результате, я думаю, это может быть то, что вы хотите. Если это не так, это должно привести к изменению вашей фактической логики

-- Sample Table
declare @sample table
(
    rec#        int,
    EmpNmbr     int,
    Store       varchar(5),
    StorEffDate date,
    PartTime    char(1),
    PTEffDate   date,
    EmpGrp      varchar(10),
    EmpGrpEffDate   date
)

-- Sample Data
insert into @sample 
select  1,    90122,   'T202',   '2018-07-03',   'X',    '2018-07-26',    'Summary', '2018-07-01'   union all
select  2,    90122,   'LR86',   '2018-08-13',    null,  '2018-07-20',    'Regular', '2018-08-14'   

-- The Query
select  rec#, n.EffDate, n.ExpDate, n.Store, n.EmpGrp, n.PartTime
from    @sample s
    cross apply
    (
        select  EffDate = s.StorEffDate, ExpDate = dateadd(day, -1, s.PTEffDate), s.Store, s.EmpGrp, PartTime = null
        where   StorEffDate < PTEffDate

        union all

        select  top 1 EffDate = s.PTEffDate, ExpDate = dateadd(day, -1, s.StorEffDate), x.Store, x.EmpGrp, PartTime = null
        from    @sample x
        where   s.PTEffDate < s.StorEffDate
        and x.StorEffDate   < s.StorEffDate
        order by x.StorEffDate desc

        union all

        select  top 1 EffDate = s.StorEffDate, ExpDate = s.StorEffDate, s.Store, x.EmpGrp, s.PartTime
        from    @sample x
        where   s.StorEffDate   < s.EmpGrpEffDate
        and x.StorEffDate   < s.StorEffDate
        order by x.StorEffDate desc

        union all

        select  EffDate = s.PTEffDate, ExpDate = '01/01/3000', s.Store, s.EmpGrp, s.PartTime
        where   s.PTEffDate > s.EmpGrpEffDate

        union all

        select  EffDate = s.EmpGrpEffDate, ExpDate = '01/01/3000', s.Store, s.EmpGrp, s.PartTime
        where   s.PTEffDate < s.EmpGrpEffDate
    ) n
order by rec#, EffDate
SQL, SQL-сервер,
Похожие вопросы