与 sum 一起的情况
Posted
技术标签:
【中文标题】与 sum 一起的情况【英文标题】:Case when along with sum 【发布时间】:2018-10-31 14:55:50 【问题描述】:有一个额外的付款人称为工人补偿,我试图通过做 case when 声明将其作为工人补偿/责任。我正在尝试返回一行。您的帮助将不胜感激。
这是我的查询:
select distinct
case when payer.class like 'Workers%'
then 'Workers Comp/Liability'
else Payer.class
end as Payer,
sum(Payment.payment_at) AS SumOfPmt
from Payer inner join Payer.payerid = Payment.payerid
where payer.class like 'Workers%'
Group By payer.class
结果:
Payer | SumOfPmt
Workers Comp/Liability | 558.76
Workers Comp/Liability | 167036.41
我想要什么:
Payer | SumOfPmt
Workers Comp/Liability | 167595.17
【问题讨论】:
正如您对该 GROUP BY 所要求的那样,每个不同的payer.class
将获得 1 行。你没有显示payer.class
列,所以很难说,但这就是正在发生的事情。相反,您希望聚合 CASE 语句的结果,因此只需 GROUP BY payer
或 GROUP BY <same case statement here>
。或者将未聚合的 SELECT 语句放入子查询中并在其上运行您的 GROUP BY。
是的。我有两个独特的付款人('Workers Comp' 和 'Workers Comp/Liability'),但他们应该只是一个 Worker Comp/Liability,这意味着 'Workers Comp' 是系统上的错字,我找不到办法将它们相加成一行。
【参考方案1】:
我会用GROUP BY
子句重复相同的CASE
表达式:
select (case when p.class like 'Workers%'
then 'Workers Comp/Liability'
else p.class
end) as Payer,
sum(pay.payment_at) AS SumOfPmt
from Payer p inner join
Payment py
on p.payerid = py.payerid
where p.class like 'Workers%'
group by (case when p.class like 'Workers%'
then 'Workers Comp/Liability'
else p.class
end);
您不需要使用DISTINCT
,因为它有GROUP BY
。
【讨论】:
你成功了。非常感谢您的帮助。【参考方案2】:这将是您的查询的一种更简单的形式:
select 'Workers Comp/Liability' as Payer,
sum(pm.payment_at) AS SumOfPmt
from Payer py inner join
Payment pm
on py.payerid = pm.payerid
where py.class like 'Workers%';
您的WHERE
子句和CASE
表达式正在做同样的事情。只需要一个。
【讨论】:
以上是关于与 sum 一起的情况的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI:如何在这种情况下将 .overlay 与 GeometryReader 一起使用?
在没有插件的情况下将 Google Analytics 与 Phonegap 2.1 一起使用?
在不使用 Selenium 的情况下将 ChromeDriver 与 WebDriverIO 一起使用
在没有连接 Servlet 的情况下将 JSP 与 Tomcat 一起使用