【问题标题】:SQL - Summing aggregate sub querySQL - 汇总聚合子查询
【发布时间】: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


【解决方案1】:

你需要做的几件事。

  1. 从 select 和 group by 中注释掉 pkg_li_no
  2. 将 having 语句更改为包含在 where 语句中
  3. 从paid_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 或状态进行选择或分组,但您更了解正在寻找的结果。如果它们是不同的值,就会有不同的记录。

【讨论】:

    【解决方案2】:

    我不确定您要完成什么,但您似乎对查询进行了过度思考。尝试简化它。 仅供参考 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  
    

    【讨论】:

      猜你喜欢
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      相关资源
      最近更新 更多