【发布时间】:2020-03-07 14:41:23
【问题描述】:
这是我的代码
select distinct sli.order_no,
sli.pkg_no,
case when line.primary_ind = 'Y' then sum(paid_amt) else 0 end as paid_amt,
line.pkg_li_no,
sum(case when sli.perf_no = 0 then 1 else 0 end) as num_seats_pur,
sli.status
from t_sub_line sli
left outer join t_line line on sli.li_seq_no = line.li_seq_no
where sli.order_no in (1,2)
group by
sli.order_no,
sli.pkg_no,
line.primary_ind,
line.pkg_li_no,
sli.status
having line.primary_ind = 'Y'
这段代码产生这个输出
order_no pkg_no paid_amt pkg_li_no num_seats_pur status
1 322 124.00 967 2 7
1 322 -124.00 992 2 4
2 854 253.00 952 1 7
2 854 -253.00 996 1 4
我真正需要的数据返回如下。我需要paid_amt 字段的总和。
order_no pkg_no paid_amt pkg_li_no num_seats_pur status
1 322 0 967 2 7
2 854 0 996 1 4
即使我将状态更改为最大(状态),所以它不会对其进行分组。我没有 sum_paid amt。
当我尝试这段代码时:
sum(case when line.primary_ind = 'Y' then sum(paid_amt) else 0 end) as paid_amt,
我收到以下错误消息
Cannot perform an aggregate function on an expression containing an aggregate or a subquery.
【问题讨论】:
-
你为什么选择 pkg_li_no 和 status 的值?
-
@CaiusJard 这是一个嵌套查询,用于连接(到外部/父查询)。 pkg_li_no 和 order_no
-
您是否尝试过以下行,将总和移到外部(删除 case 语句中的总和)?我认为您无法获得总和,尽管我之前没有尝试过: sum(case when line.primary_ind = 'Y' then paid_amt else 0 end) aspaid_amt
-
@TinyHaitian 我没有,但我只是试了一下,嵌套查询返回相同的值。这个想法是我们需要抑制一些总和为零的记录。我想不出另一种方法来做到这一点
-
我的意思是“在您想要的输出中,您可以选择 7 或 4 作为状态。为什么 pkgno 322 获得状态 7 而 pkgno 854 获得状态 4?一个是最大值,一个是最小值. 它不一致,很难编码”。 pkg_li_no 也一样——你选择了一个最大值,另一个选择最小值。为什么? (首先我们必须确定你脑子里的算法,然后才能把它变成sql)
标签: sql-server tsql sum subquery case