sql - 进行内部查询以删除重复的代码
问题描述
我有 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 中复制了此代码
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 天 WHEN DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) >60 THEN 60 - 90 天 WHEN DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) > 30 THEN '30 - 60 Days' WHEN DATEDIFF(Day,CONVERT(DATE,be.timeWorkedFrom),GETDATE()) 为 NULL THEN '90 + Days' ELSE '0 - 30 Days' END
如何在 SELECT 和 GROUP BY 中正确地进行内部查询和别名?
解决方案
不幸的是,子句中定义的别名对同一级别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;
推荐阅读
- r - 我如何使用指标或虚拟变量作为因子变量?
- tortoisesvn - 需要澄清 svn update,它究竟是如何工作的?
- r - 从栅格列表中计算平均值并将其保存为不同的名称
- python - 如何用另一个函数修改函数中的变量
- cplex - How can I write a objective function of p center problem in cplex?
- c# - 通过多态限制类型参数基类
- pyspark - “groupby.apply”和“groupby.agg”之间的区别
- c# - c#存储库模式如何访问依赖注入类中的值
- mysql - 遍历 SQL 表,对满足条件的每一行执行查询
- github - 我可以通过“git pull staff master”远程下载任意次数的内容吗?