错误1111(HY000) - 无效使用组功能

时间:2013-11-17 00:39:44

标签: mysql sql

尝试运行此查询时遇到问题:

Select 
       c.cname as custName, 
       count(distinct o.orderID) as No_of_orders, 
       avg(count(distinct o.orderID)) as avg_order_amt
From Customer c
Inner Join Order_ o
On o.customerID = c.customerID
Group by cname;

这是一条错误消息:#1111 (HY000) - Invalid use of group function

我只想选择每个客户,查找每个客户有多少订单,并平均每个客户的订单总数。我认为在查询中可能存在太多聚合的问题。

3 个答案:

答案 0 :(得分:1)

问题是如果你想计算一个计数的平均值,你需要有两个单独的分组,所以这个表达式是无效的:

avg(count(distinct o.orderID))

现在很难理解你究竟是什么意思,但听起来好像你只想用avg(o.amount)代替。

[edit]我现在看到你的添加,所以虽然错误仍然相同,但解决方案会稍微复杂一些。您需要的最后一个值,即每个客户的平均订单数量,不是每个客户计算的值。你需要分析函数,但在MySQL中这可能非常棘手。我建议为此编写一个单独的查询,否则你会有非常复杂的查询,无论如何都会为每一行返回相同的数字。

答案 1 :(得分:0)

select c.cname, o.customerID, count(*), avg(order_total)
from order o join customer using(customerID)
group by 1,2

这将计算每个客户的订单数量和平均订单总数(替换order_total的实际列名称)。

答案 2 :(得分:0)

  

每个客户有多少订单,   平均订单总数。

SELECT
    c1.cname AS custName,
    c1.No_of_orders,
    c2.avg_order_amt
FROM (
        SELECT
            c.id,
            c.cname, 
            COUNT(DISTINCT o.orderID) AS No_of_orders
        FROM 
            Customer c
                JOIN Order_ o ON o.customerID = c.customerID
        GROUP BY c.id, c.cname
    ) c1
    CROSS JOIN (SELECT AVG(No_of_orders) AS avg_order_amt FROM (
        SELECT 
            c.id,
            COUNT(DISTINCT o.orderID) AS No_of_orders
        FROM 
            Customer c
                JOIN Order_ o ON o.customerID = c.customerID
        GROUP BY c.id
    )) c2