【发布时间】:2019-03-22 23:41:53
【问题描述】:
我有 redshift 脚本,其中有重复的代码
这是脚本
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 中复制了这段代码
案例 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' 当 DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) 为 NULL THEN '90 + Days' ELSE '0 - 30 天' 结束
如何在 SELECT 和 GROUP BY 中正确地进行内部查询和别名?
【问题讨论】:
-
您是否尝试过使用带有范围的附加表而不是硬编码
case表达式?您可能会将该表创建为 CTE,例如with OpenedAgingRanges (from,to,display) as (select 0,30,'' union all select 30,60,'30-60 Days') union all ... ) select ..., r.display from ... left join OpenedAgingRanges r on DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) >= r.from and DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) < r.to
标签: sql amazon-redshift