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

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

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

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

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

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

0
Chris D King 15 Окт 2019 в 21:29

1 ответ

Лучший ответ

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

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
1
Sean Lange 15 Окт 2019 в 18:47