【问题标题】:error: 1111 Invalid use of group function错误:1111 组功能使用无效
【发布时间】:2016-12-11 18:29:44
【问题描述】:

我已经搜索了解决方案,但似乎都需要将 WHERE 替换为 HAVING。我不相信这有同样的问题,我无法弄清楚可能出了什么问题。我已经尝试替换在 WHERE 子句中有引用和任何聚合函数的代码的不同部分,但我仍然遇到相同的错误。以下是我的整个 MySQL 语句,它获取卖家的统计数据及其在选定时期内的表现。

SELECT users.name AS sellername, users.id AS sellerid, `providers`.`id`, providers.name AS providername, 
COUNT(sales.id) as brutto, COUNT(sale_netto.id) as netto, AVG(sale_quality.grade) as grade, 
SUM(COUNT(sales.id)-COUNT(sale_netto.id)) as diff, (COUNT(sales.id)/COUNT(sales.id)+COUNT(sale_netto.id))*100 AS perc 
FROM `product_regretrules` 
LEFT JOIN `product_categories` ON `product_categories`.`id` = `product_regretrules`.`product_category_id` 
LEFT JOIN `product_product_category` ON `product_product_category`.`product_category_id` = `product_categories`.`id` 
LEFT JOIN `products` ON `products`.`id` = `product_regretrules`.`product_id` 
OR `products`.`id` = `product_product_category.product_id` 
LEFT JOIN `sales` ON `sales`.`product_id` = `products`.`id` 
LEFT JOIN `sale_netto` ON `sale_netto`.`sale_id` = `sales`.`id` 
LEFT JOIN `users` ON `users`.`id` = `sales`.`seller_id` 
LEFT JOIN `providers` ON `providers`.`id` = `products`.`provider_id` 
LEFT JOIN `sale_quality` ON `sale_quality`.`sale_id` = `sales`.`id` 
WHERE `sale_netto`.`upload_id` = 725 
AND `sale_netto`.`id` is not null 
AND `sales`.`sell_date` between 2015-12-04 and 2016-08-06 
AND `product_regretrules`.`deleted_at` is null 
GROUP BY `users.id`, `providers`.`id`

请查看查询的问题,我对如何获得正确数字/统计数据的答案或 cmets 不感兴趣。

【问题讨论】:

  • 似乎这部分是问题 'SUM(COUNT(sales.id)-COUNT(sale_netto.id)) as diff' 我会回答的原因,但我不确定它为什么会导致问题所以我希望有人能解释一下。

标签: mysql select group-by


【解决方案1】:

您不能在聚合上聚合:SUM(COUNT(sales.id)-COUNT(sale_netto.id))

像这样重写你的查询:

SELECT sellername, sellerid, id, providername, brutto, netto, grade, sum(diff), perc
FROM 
(
SELECT users.name AS sellername, users.id AS sellerid, `providers`.`id`, providers.name AS providername, 
COUNT(sales.id) as brutto, COUNT(sale_netto.id) as netto, AVG(sale_quality.grade) as grade, 
COUNT(sales.id)-COUNT(sale_netto.id) as diff, (COUNT(sales.id)/COUNT(sales.id)+COUNT(sale_netto.id))*100 AS perc 
FROM `product_regretrules` 
LEFT JOIN `product_categories` ON `product_categories`.`id` = `product_regretrules`.`product_category_id` 
LEFT JOIN `product_product_category` ON `product_product_category`.`product_category_id` = `product_categories`.`id` 
LEFT JOIN `products` ON `products`.`id` = `product_regretrules`.`product_id` 
OR `products`.`id` = `product_product_category.product_id` 
LEFT JOIN `sales` ON `sales`.`product_id` = `products`.`id` 
LEFT JOIN `sale_netto` ON `sale_netto`.`sale_id` = `sales`.`id` 
LEFT JOIN `users` ON `users`.`id` = `sales`.`seller_id` 
LEFT JOIN `providers` ON `providers`.`id` = `products`.`provider_id` 
LEFT JOIN `sale_quality` ON `sale_quality`.`sale_id` = `sales`.`id` 
WHERE `sale_netto`.`upload_id` = 725 
AND `sale_netto`.`id` is not null 
AND `sales`.`sell_date` between 2015-12-04 and 2016-08-06 
AND `product_regretrules`.`deleted_at` is null 
GROUP BY `users.id`, `providers`.`id`
) as t
GROUP BY sellername, sellerid, id, providername, brutto, netto, grade, perc;

【讨论】:

    【解决方案2】:

    尝试将其用于GROUP BY

    GROUP BY  users.name, users.id, `providers`.`id`, providers.name
    

    您可能开启了严格的GROUP BY 模式。这会导致 MySQL 遵循 ANSI 标准,并且不允许在聚合查询中使用 SELECT 中的“裸”列。

    或者,您可以将SELECT 更改为:

    SELECT MAX(users.name) AS sellername, users.id AS sellerid,
          `providers`.`id`, MAX(providers.name) AS providername,
    

    编辑:

    哦,仔细检查后,我发现了问题。你有:

    SUM(COUNT(sales.id)-COUNT(sale_netto.id)) as diff
    

    您不能嵌套聚合函数。大概,你打算:

    (COUNT(sales.id)-COUNT(sale_netto.id)) as diff
    

    【讨论】:

    • 谢谢,但仍然是同样的错误。完全删除 GROUP BY 仍然会为查询提供相同的错误。
    • 在以下答案之前的编辑是正确的。谢谢!
    猜你喜欢
    • 2014-04-04
    • 2015-11-28
    • 2021-11-03
    • 2021-11-21
    • 1970-01-01
    • 2017-07-24
    • 2015-06-30
    • 1970-01-01
    • 2021-11-21
    相关资源
    最近更新 更多