Sql server SQL-求和聚合子查询

Sql server SQL-求和聚合子查询,sql-server,tsql,sum,subquery,case,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 nu

这是我的密码

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
我真正需要的是返回以下数据。我需要“已付金额”字段的总和

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
即使我将status更改为max(status),它也不会在上面分组。我没有支付金额

当我尝试此代码时:

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.

我不确定你想完成什么,但似乎你对这个问题想得太多了。尽量简化它。 仅供参考,
在分组之后发生
,其中发生在分组之前,您甚至不需要
案例

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  

你需要做几件事

  • 从“选择和分组依据”中注释掉pkg_li_no
  • 更改要包含在where语句中的having语句
  • 从已付金额中删除该案例,因为它不是必需的
  • 其他注意事项:
    我不确定您是否希望根据pkg_no或status进行选择或分组,但您更了解我们想要的结果。如果它们是不同的值,则会有不同的记录。

    为什么选择pkg_li_no和status的值?@CaiusJard这是一个嵌套查询,用于连接(外部/父查询)。pkg_li_no和order_noDid您是否尝试将sum移到外部(删除case语句内部的sum)?我不认为你能得到一个总和,尽管我以前从未尝试过:sum(line.primary\u ind='Y'then paid\u amt else 0 end)as paid_amt@TinyHaitian我没有,但我只是尝试了一下,嵌套查询返回相同的值。我们的想法是,我们需要抑制一些总和为零的记录。我想不出另外一种方法来实现这一点,我的意思是“在您想要的输出中,您可以选择7或4作为状态。为什么pkgno 322获得状态7,pkgno 854获得状态4?一个是最大值,一个是最小值。这是不一致的,很难编码”。pkg_Liu_no也是一样-你选择了一个最大值,另一个最小值。为什么?(首先,我们必须确定您头脑中的算法,然后才能将其转换为sql)
      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