代码之家  ›  专栏  ›  技术社区  ›  novicePrgrmr

where子句中聚合函数的SQL问题

  •  6
  • novicePrgrmr  · 技术社区  · 14 年前

    我正在处理这个SQL问题:

    显示收费金额和实际金额不同的任何采购订单。通过显示采购订单号、每个采购订单的POAmount、实际金额(通过添加订单中所有项目的价格计算)以及两者之间的差异来显示。对结果进行排序,首先显示差异最大的结果。

    错误代码-1,SQL状态42903:聚合函数的使用无效。

    select 
      purchaseorder.ponum, 
      purchaseorder.amount, 
      sum(poitems.quantity*poitems.unitprice), 
      purchaseorder.amount-sum(poitems.quantity*poitems.unitprice)
    from  purchaseorder, poitems
    where 
      purchaseorder.ponum = poitems.ponum 
        and purchaseorder.amount!=sum(poitems.quantity*poitems.unitprice)
    group by 
      purchaseorder.ponum, 
      purchaseorder.amount
    

    我想是因为我在where子句中使用了聚合函数。

    我怎样才能解决这个问题???

    谢谢,

    4 回复  |  直到 14 年前
        1
  •  5
  •   John Hartsock    14 年前

    试试这个:

    select 
      purchaseorder.ponum, 
      purchaseorder.amount, 
      sum(poitems.quantity*poitems.unitprice),   
      purchaseorder.amount-sum(poitems.quantity*poitems.unitprice) 
    from  purchaseorder, poitems 
    where 
      purchaseorder.ponum = poitems.ponum 
    group by 
      purchaseorder.ponum, 
      purchaseorder.amount 
    having  
      purchaseorder.amount!=sum(poitems.quantity*poitems.unitprice)
    
        2
  •  3
  •   tobyodavies    14 年前

    你不能在 where having 换成

    select purchaseorder.ponum,
           purchaseorder.amount,
           sum(poitems.quantity*poitems.unitprice) as actual,
           purchaseorder.amount - sum(poitems.quantity*poitems.unitprice) as diff
    from  purchaseorder,
          poitems
    where purchaseorder.ponum = poitems.ponum
    group by purchaseorder.ponum,
             purchaseorder.diff
    having diff != 0
    order by ABS(diff) desc
    
        3
  •  1
  •   Daniel Vassallo    14 年前

    看起来你应该用 HAVING 改为子句:

    SELECT    ...
    FROM      purchaseorder
    JOIN      poitems ON (purchaseorder.ponum = poitems.ponum)
    GROUP BY  purchaseorder.ponum, purchaseorder.amount
    HAVING    purchaseorder.amount != sum(poitems.quantity * poitems.unitprice);
    

    LIMIT 在之后应用

    注意,SQL标准要求 GROUP BY 聚合函数中使用的子句或列。但是,MySQL支持对此行为的扩展,并允许 引用 SELECT 外部子查询中的列表和列。

        4
  •  0
  •   novicePrgrmr    14 年前

    这是对我有用的。谢谢你们!

    select purchaseorder.ponum,
       purchaseorder.amount,
       sum(poitems.quantity*poitems.unitprice) as actual,
       purchaseorder.amount - sum(poitems.quantity*poitems.unitprice) as "diff"
    FROM      purchaseorder
    JOIN      poitems ON (purchaseorder.ponum = poitems.ponum)
    GROUP BY  purchaseorder.ponum, purchaseorder.amount
    HAVING    purchaseorder.amount != sum(poitems.quantity * poitems.unitprice)
    order by "diff" desc