【问题标题】:mysql use logic in where clause + invalid use of group functionmysql在where子句中使用逻辑+无效使用组函数
【发布时间】:2012-12-21 08:05:44
【问题描述】:

我有下面的 mysql 查询输出下面的图像:

select
  v.invoicenumber,
  v.invoicedate,
  v.haulier,
  v.transporttype,
  count(v.loadnumber) as totalloads,
  sum(v.cost) as totalcost, 
  concat(SUM(if(invoiceapproved = 'yes', 1, 0)),' / ',count(v.loadnumber)) AS count,  SUM(if(invoiceapproved = 'yes', 1, 0)) as approved
from v2loads v  
  where v.invoiced='yes'   
  group by invoicenumber

此查询执行 100%。

我想要做的是过滤掉计数为 100% 的任何行/数据。在示例输出中,我想过滤掉发票 16,因为它是 2/2 和 100%。所以在哪里

 count(v.loadnumber) <> SUM(if(invoiceapproved = 'yes', 1, 0))

如果我将此逻辑添加到 where 子句中,它会因错误无效使用组函数而失败。所以下面的代码不起作用:

select v.invoicenumber,
  v.invoicedate,
  v.haulier,
  v.transporttype,
  count(v.loadnumber) as totalloads,
  sum(v.cost) as totalcost, 
  concat(SUM(if(invoiceapproved = 'yes', 1, 0)),' / ',count(v.loadnumber)) AS count, 
  SUM(if(invoiceapproved = 'yes', 1, 0)) as approved 
from v2loads v  
  where v.invoiced='yes' and 
  (count(v.loadnumber))<>(SUM(if(invoiceapproved = 'yes', 1, 0)))  
  group by invoicenumber

我收到以下错误:

错误是#1111 - 组函数的使用无效。

一如既往地感谢任何建议。

【问题讨论】:

    标签: mysql sql logic where


    【解决方案1】:

    你可以这样做:

    SELECT 
      *,
      CONCAT(approved, ' / ', totalloads) AS count, 
    FROM
    (
        SELECT
          v.invoicenumber,
          v.invoicedate,
          v.haulier,
          v.transporttype,
          COUNT(v.loadnumber)                    AS totalloads,
          SUM(v.cost)                            AS totalcost, 
          SUM(if(invoiceapproved = 'yes', 1, 0)) As approved 
        FROM v2loads v  
        WHERE v.invoiced='yes'
        GROUP BY invoicenumber
    ) t
    WHERE totalloads <> approved;
    

    【讨论】:

    • 太棒了,是的,你是对的,从没想过嵌套它。谢谢马哈茂德。
    【解决方案2】:
    select v.invoicenumber,
    v.invoicedate,
    v.haulier,
    v.transporttype,
    count(v.loadnumber) as totalloads,
    sum(v.cost) as totalcost, 
    concat(SUM(if(invoiceapproved = 'yes', 1, 0)),' / ',count(v.loadnumber)) AS count,
    SUM(if(invoiceapproved = 'yes', 1, 0)) as approved  
    from v2loads v 
    where v.invoiced='yes'
    group by invoicenumber 
    having (count(v.loadnumber))<>(SUM(if(invoiceapproved = 'yes', 1, 0)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 2021-10-31
      • 2012-06-24
      • 1970-01-01
      相关资源
      最近更新 更多