Как создать столбцы на основе других столбцов SQL Server 2012 - PullRequest
0 голосов
/ 16 марта 2019

У меня есть 2 таблицы @Claims и @ClaimsActivity:

enter image description here

Запрос:

declare @Claims table (ClaimID int)

insert into @Claims 
values (6070), (6080)

declare @ClaimsActivity table 
                        (
                            Activityid int, 
                            ClaimID int, 
                            Activity int, 
                            ActivityDate datetime, 
                            ClaimStatus int
                        )

insert into @ClaimsActivity 
values (1, 6070, 0, '2017-11-05 20:23:16.640', 0),
       (3, 6070, 6, '2017-11-06 13:50:28.203', 0),
       (4, 6070, 9, '2017-11-07 13:39:28.410', 0),
       (5, 6070, 10, '2017-11-07 13:40:49.980', 0),
       (7, 6070, 8, '2017-11-07 15:46:18.367', 1),
       (8, 6070, 8, '2017-11-07 16:50:49.543', 1),
       (9, 6070, 9, '2017-11-07 16:50:54.733', 0),
       (10, 6070, 4, '2017-11-07 16:55:22.135', 0),
       (11, 6070, 6, '2017-11-08 18:32:15.101', 0),
       (12, 6080, 0, '2017-11-12 11:15:17.199', 0),
       (13, 6080, 8, '2017-11-13 09:12:23.203', 1)

select * 
from @Claims

select * 
from @ClaimsActivity 
order by ActivityDate

Мне нужно добавить 2 столбца на основе данных в @ClaimsActivity: IsReopened и DateReopened

Логика такова:

  • Если последний ClaimStatus (на основе ActivityDate) = 1, тогда IsReopened = 0
  • Но если последний ClaimStatus = 0, то нужно пойти и проверить, является ли один из Activity = 9 (Претензия возобновлена)
  • , а если одно из заданий = 9, то IsReopened должно = 1, а DateReopened должно быть последним днем ​​его открытия

Я привел столбец StatusOfClaim, но мне также нужно IsReopened и DateReopened

select 
    Claimid,
    isnull((select top 1 
                case when al.ClaimStatus = 1 
                   then 'Closed' 
                   else 'Open' 
                end
            from
                @ClaimsActivity al 
            where 
                C.ClaimID = al.ClaimID 
            order by  
                al.ActivityDate desc), 'Open') as 'Status of Claim',
    NULL as 'isReopen',
    NULL as 'DateReopened'
from
    @Claims c

Желаемый результат должен быть таким:

enter image description here

1 Ответ

2 голосов
/ 16 марта 2019

Есть много разных способов сделать это, но вот пример использования CROSS APPLY и OUTER APPLY:

SELECT 
    ClaimID,
    CASE WHEN tmp.IsOpen = 1 THEN 'Open' ELSE 'Closed' END AS 'Status of Claim',
    CASE WHEN tmp.IsOpen = 1 AND lastReopen.Activityid IS NOT NULL THEN 1 ELSE 0 END AS 'isReopen',
    lastReopen.ActivityDate AS 'DateReopened'
FROM @Claims c
    CROSS APPLY (
        SELECT ISNULL((
            SELECT TOP 1 CASE WHEN al.ClaimStatus = 1 THEN 0 ELSE 1 END 
            FROM @ClaimsActivity al 
            WHERE c.ClaimID = al.ClaimID 
            ORDER BY al.ActivityDate DESC
        ), 1) AS IsOpen
    ) tmp
    OUTER APPLY (
        SELECT TOP 1
            al.Activityid,
            al.ActivityDate
        FROM @ClaimsActivity al 
        WHERE c.ClaimID = al.ClaimID AND al.Activity = 9
        ORDER BY al.ActivityDate DESC 
    ) lastReopen

CROSS APPLY просто используется для создания столбца, который сообщает нам, является ли заявка открытой или закрытой, и мы можем повторно использовать это в оставшейся части запроса.

OUTER APPLY используется для перехода к последнему "вновь открытому" действию для каждого утверждения, для которого вы хотите указать дату.

Я не могу подтвердить выполнение этого запроса, но это должно по крайней мере дать вам правильные результаты.

...