Сделать внутренний запрос на удаление дублированного кода - PullRequest
0 голосов
/ 18 октября 2018

У меня есть скрипт красного смещения, в котором я продублировал код

Вот скрипт

    SELECT  
       CASE
              WHEN DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) >120 THEN '120 + Days'
              WHEN DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) >90 THEN '90 - 120 Days'
              WHEN DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) >60 THEN '60 - 90 Days'
              WHEN DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) >30 THEN '30 - 60 Days'
              WHEN DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) IS NULL THEN '90 + Days'
              ELSE '0 - 30 Days'
       END AS OpenedAging,
       be.ClientId,
       cc.FullName AS ClientName,
       SUM(CASE
              WHEN (bes.UseAgreedView) = 1 THEN a.ChargeTotalAgreed
              ELSE a.ChargeTotal
       END - a.PaymentAdjustment - a.PaymentAmount) AS Owed
FROM    public.billing_entries be
LEFT JOIN
       (
       SELECT  bed.BillingEntryId,
               bed.PaymentCount,
               bed.PaymentRegular,
               bed.Copay,
               bed.ChargeTotal,
               bed.ChargeTotalAgreed,
               bed.PaymentAdjustment,
               bed.PaymentRegular + bed.PaymentCopay - bed.PaymentAdjustment AS PaymentAmount
       FROM    public.billing_entry_dimensions bed
       ) a
ON      a.BillingEntryId = be.Id
LEFT JOIN
       public.billing_settings bes
ON     bes.OrganizationId = be.OrganizationId
LEFT JOIN
       public.contact_insurances cic
ON     cic.Id = be.insuranceId
LEFT JOIN
       public.insurance ic
ON     ic.Id = cic.InsuranceCompanyId
LEFT JOIN
       public.contact_addresses ca
ON     ca.Id = be.ClientLocationId

LEFT JOIN       
       public.contacts cc
ON     cc.Id = be.ClientId

WHERE   be.OrganizationId = 65277
       AND be.IsVoid IS NULL
       AND be.IsDeleted IS NULL

GROUP BY        
       CASE
       WHEN DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) >120 THEN '120 + Days'
       WHEN DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) >90 THEN '90 - 120 Days'
       WHEN DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) >60 THEN '60 - 90 Days'
       WHEN DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) >30 THEN '30 - 60 Days'
              WHEN DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) IS NULL THEN '90 + Days'
              ELSE '0 - 30 Days'
       END,
       be.ClientId,
       cc.FullName

Как видите, этот код продублирован в SELECT и в GROUP BY

СЛУЧАЙ, КОГДА DATEDIFF (День, КОНВЕРТ (DATE, be.timeWorkedFrom), GETDATE ())> 120 ТОГДА '120 + Дней', КОГДА DATEDIFF (День, КОНВЕРТ (DATE, be.timeWorkedFrom), GETDATE ())> 90 THEN '90 - 120 дней 'WHEN DATEDIFF (Day, CONVERT (DATE, be.timeWorkedFrom), GETDATE ())> 60 THEN '60 - 90 Days' WHEN DATEDIFF (Day, CONVERT (DATE,be.timeWorkedFrom), GETDATE ())> 30, ТО «30–60 дней» КОГДА DATEDIFF (Day, CONVERT (DATE, be.timeWorkedFrom), GETDATE ()) равен нулю «90 + Days« ELSE »0 - 30 дней'END

Как сделать внутренний запрос и правильно присвоить ему псевдоним SELECT и GROUP BY?

Ответы [ 2 ]

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

Вы можете сделать group by 1,2,3, цифры здесь обозначают индексы в вашем списке столбцов.По сути, вы будете ссылаться на свой оператор CASE и два других столбца, как этот.

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

К сожалению, псевдоним, определенный в предложении SELECT, невидим для предложения GROUP BY на том же уровне.Единственный вариант, который приходит на ум, - это обернуть ваш текущий запрос в CTE, а затем подзапросить его с агрегацией, повторно используя псевдоним в выражении CASE:

WITH cte AS (
    SELECT  
        CASE
            WHEN DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) >120 THEN '120 + Days'
            WHEN DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) >90 THEN '90 - 120 Days'
            WHEN DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) >60 THEN '60 - 90 Days'
            WHEN DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) >30 THEN '30 - 60 Days'
            WHEN DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) IS NULL THEN '90 + Days'
            ELSE '0 - 30 Days'
        END AS OpenedAging,
        be.ClientId,
        cc.FullName AS ClientName,
        bes.UseAgreedView,
        a.ChargeTotalAgreed,
        a.ChargeTotal,
        a.PaymentAdjustment,
        a.PaymentAmount
    FROM public.billing_entries be
    LEFT JOIN
    (
        SELECT
            bed.BillingEntryId,
            bed.PaymentCount,
            bed.PaymentRegular,
            bed.Copay,
            bed.ChargeTotal,
            bed.ChargeTotalAgreed,
            bed.PaymentAdjustment,
            bed.PaymentRegular + bed.PaymentCopay - bed.PaymentAdjustment AS PaymentAmount
        FROM public.billing_entry_dimensions bed
    ) a
        ON a.BillingEntryId = be.Id
    LEFT JOIN public.billing_settings bes
        ON bes.OrganizationId = be.OrganizationId
    LEFT JOIN public.contact_insurances cic
        ON cic.Id = be.insuranceId
    LEFT JOIN public.insurance ic
        ON ic.Id = cic.InsuranceCompanyId
    LEFT JOIN public.contact_addresses ca
        ON ca.Id = be.ClientLocationId
    LEFT JOIN public.contacts cc
        ON cc.Id = be.ClientId
    WHERE
        be.OrganizationId = 65277 AND
        be.IsVoid IS NULL         AND
        be.IsDeleted IS NULL
)

А вот фактический запросиспользуя вышеуказанный CTE:

SELECT  
    OpenedAging,
    ClientId,
    ClientName,
    SUM(CASE WHEN UseAgreedView = 1
             THEN ChargeTotalAgreed
             ELSE a.ChargeTotal END - PaymentAdjustment - PaymentAmount) AS Owed
FROM cte
GROUP BY
    OpenedAging,
    ClientId,
    ClientName;
...