6

MySQL の classicmodels データベースを使用しています。次のクエリは正常に機能します (where 句に注意してください)。

select 
    customers.customerNumber as 'Customer ID',
    customers.customerName as 'Customer Name',
    count(orders.orderNumber) as 'Total Orders Placed'
from customers
left join orders on customers.customerNumber = orders.customerNumber
where customers.customerNumber > 200
group by
    customers.customerNumber
order by 
    3 asc

しかし、以下はエラーになります。その意図は、結果の行セットに 3 つ以上注文した顧客のみを表示することです。私は何を間違っていますか?

select 
    customers.customerNumber as 'Customer ID',
    customers.customerName as 'Customer Name',
    count(orders.orderNumber) as 'Total Orders Placed'
from customers
left join orders on customers.customerNumber = orders.customerNumber
where count(orders.orderNumber) > 3
group by
    customers.customerNumber
order by 
    3 asc

MySQL エラー:エラー コード: 1111。グループ関数の無効な使用

4

5 に答える 5

11

集計関数 (COUNT(), AVG(), SUM(),など) はWHERE、それらがいつ計算されるかにより、句に表示できません。代わりに、それらはHAVING句に属します。

select 
    customers.customerNumber as 'Customer ID',
    customers.customerName as 'Customer Name',
    count(orders.orderNumber) as 'Total Orders Placed'
from customers
left join orders on customers.customerNumber = orders.customerNumber
group by
    customers.customerNumber
HAVING count(orders.orderNumber) > 3
order by 
    3 asc
于 2012-05-12T02:19:12.787 に答える
1

より効率的な方法は、集約によってグループをネストされた派生テーブルに移動し、それに結合することです。

SELECT 
  c.customerNumber AS 'Customer ID',
  c.customerName AS 'Customer Name',
  o.orderCount AS 'Total Orders Placed'
FROM 
  customers c
LEFT JOIN
  (SELECT
     customerNumber, 
     COUNT(*) AS orderCount
   FROM
     orders
   GROUP BY
     customerNumber) o
 ON
   c.customerNumber = o.customerNumber
 WHERE
   o.orderCount > 3
 ORDER BY
   3
于 2012-05-12T03:04:47.520 に答える
1

これを試してください

select 
  customers.customerNumber as 'Customer ID',
  customers.customerName as 'Customer Name',
  count(orders.orderNumber) as 'Total Orders Placed'
from customers
inner join orders on customers.customerNumber = orders.customerNumber
group by
  customers.customerNumber, 
  customers.customerName
having count(orders.orderNumber) > 3
order by 
  3 asc
于 2012-05-12T08:56:09.723 に答える
1

where句で集約関数を間接的に使う方法がある

クエリを次のように書き直すことができます。


select customers.customerNumber as 'Customer ID',
       customers.customerName as 'Customer Name',
       count(orders.orderNumber) as 'Total Orders Placed'
  from customers left join orders on customers.customerNumber =
                                     orders.customerNumber
 where
 (SELECT CASE
        WHEN count(orders.orderNumber) > 3 THEN
             'TRUE'
        ELSE
             'FALSE'
        END
   FROM DUAL) = 'TRUE'
 group by customers.customerNumber
 order by 3 asc

ここでは、count 関数が select 句内で使用されており、count 計算に従って TRUE または FALSE 文字列を返します。

それが役に立てば幸い

于 2012-05-12T03:25:20.373 に答える