SQL-汇总子查询汇总

时间:2019-11-11 22:08:37

标签: sql-server tsql sum subquery case

这是我的代码

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

我真正需要返回的数据如下。我需要pay_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

即使我将状态更改为max(status),所以也不会对其进行分组。我没有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.

2 个答案:

答案 0 :(得分:1)

您需要做的几件事。

  1. 从选择和分组依据中注释掉pkg_li_no
  2. 更改hading语句以包含在where语句中
  3. 因为没有必要,因此从pay_amt中删除案件
  select  distinct sli.order_no,
                    sli.pkg_no,
                    sum(paid_amt)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 join t_line line on sli.li_seq_no = line.li_seq_no
            where sli.order_no in (1,2)
            and  line.primary_ind = 'Y'
            group by
                    sli.order_no,
                    sli.pkg_no,
                    line.primary_ind,
                   -- line.pkg_li_no,
                    sli.status

其他说明: 我不确定您是否要按pkg_no或状态进行选择或分组,但是您知道要查找什么结果。如果它们是不同的值,那么将有不同的记录。

答案 1 :(得分:0)

我不确定您要完成什么,但是似乎您对查询的想法过多。尝试简化它。 仅供参考HAVING在分组之后发生,WHERE在分组之前发生,您甚至不需要CASE

select  distinct sli.order_no,
            sli.pkg_no,
            sum(paid_amt) as paid_amt, 
            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)
      and line.primary_ind = 'Y'
    group by
            sli.order_no,
            sli.pkg_no,
            sli.status