Поверните набор результатов - PullRequest
0 голосов
/ 15 октября 2019

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

Требуемый результат должен выглядеть следующим образом в терминах столбцов:

GUID, Name1, Perc1, Flag1, Name2, Perc2, Flag2, Name3, Perc3, Flag3, Name4, Perc4, Flag4, Name5, Perc5, Flag5

Мне удалось PIVOT данных, чтобы яможно получить имена, отображаемые на фоне идентификатора GUID, но я не уверен, как его расширить, чтобы получить другие поля (Perc и флаг) для каждого имени в наборе результатов.

SELECT Id, Insurer1, Insurer2, Insurer3, Insurer4, Isurer5
FROM (
   SELECT Policy.Id,
      BinderInsurer.[Percentage] As BinderInsurerPerc,
      BinderInsurer.LeadInsurer,
      Account.RegisteredCompanyName As BinderInsurerName,
      ROW_NUMBER() OVER (PARTITION BY Policy.Id ORDER BY BinderInsurer.[Percentage] DESC) AS PolCount,
      'Insurer' + CONVERT(VARCHAR(6), ROW_NUMBER() OVER (PARTITION BY Policy.Id ORDER BY BinderInsurer.[Percentage] DESC)) AS PivotKey
   FROM [Policy]
        Left Join Scheme On Scheme.Id = [Policy].SchemeId
    Left Join BinderAgreement On BinderAgreement.Id = Scheme.BinderAgreementId
    Left Join BinderSection On BinderSection.Id = Scheme.BinderSectionId
    Left Join BinderPeriod On BinderPeriod.Id = Scheme.BinderPeriodId
    Left Join BinderInsurer On BinderAgreement.Id = BinderInsurer.BinderAgreementId
    Left Join Account On Account.Id = BinderInsurer.AccountId
    ) a
PIVOT
(
MAX(a.BinderInsurerName)
FOR PivotKey IN ([Insurer1], [Insurer2], [Insurer3], [Insurer4], 
[Isurer5])
)     AS pvt

Iожидаем, что выводом будет таблица с единственной строкой для каждого GUID с оставшимися столбцами, заполненными, где это необходимо, на основе ввода.

1 Ответ

1 голос
/ 15 октября 2019

Это выстрел в темноте. Не уверен, какие столбцы в вашем запросе ссылаются на сокращение, которое вы упоминаете. Но используя условное агрегирование, вы можете сделать что-то вроде этого.

select Id
    , Insurer1 = max(case when PolCount = 1 then BinderInsurerName end)
    , Perc1 = max(case when PolCount = 1 then BinderInsurerPerc end)
    , Flag1 = max(case when PolCount = 1 then LeadInsurer end)
    , Insurer2 = max(case when PolCount = 2 then BinderInsurerName end)
    , Perc2 = max(case when PolCount = 2 then BinderInsurerPerc end)
    , Flag2 = max(case when PolCount = 2 then LeadInsurer end)
    , Insurer3 = max(case when PolCount = 3 then BinderInsurerName end)
    , Perc3 = max(case when PolCount = 3 then BinderInsurerPerc end)
    , Flag3 = max(case when PolCount = 4 then LeadInsurer end)
    , Insurer4 = max(case when PolCount = 4 then BinderInsurerName end)
    , Perc4 = max(case when PolCount = 4 then BinderInsurerPerc end)
    , Flag4 = max(case when PolCount = 4 then LeadInsurer end)    
    , Insurer5 = max(case when PolCount = 5 then BinderInsurerName end)
    , Perc5 = max(case when PolCount = 5 then BinderInsurerPerc end)
    , Flag5 = max(case when PolCount = 5 then LeadInsurer end)
from
(       
    SELECT Policy.Id,
        BinderInsurer.[Percentage] As BinderInsurerPerc,
        BinderInsurer.LeadInsurer,
        Account.RegisteredCompanyName As BinderInsurerName,
        ROW_NUMBER() OVER (PARTITION BY Policy.Id ORDER BY BinderInsurer.[Percentage] DESC) AS PolCount
    FROM [Policy]
    Left Join Scheme On Scheme.Id = [Policy].SchemeId
    Left Join BinderAgreement On BinderAgreement.Id = Scheme.BinderAgreementId
    Left Join BinderSection On BinderSection.Id = Scheme.BinderSectionId
    Left Join BinderPeriod On BinderPeriod.Id = Scheme.BinderPeriodId
    Left Join BinderInsurer On BinderAgreement.Id = BinderInsurer.BinderAgreementId
    Left Join Account On Account.Id = BinderInsurer.AccountId
) x
group by x.Id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...