2017-02-21 3 views
1

は単純なクエリである:つまりグループによると、内側には参加:「最大」のトリックなしで参加を選択する方法をここで

SELECT orders.id, customers.name, COUNT(order_product.id) 
FROM orders 
INNER JOIN order_product ON orders.id = order_product.order_id 
INNER JOIN customers ON orders.customer_id = customers.id 
GROUP BY orders.id; 

、私が欲しい:

  • ためのID 。
  • 各注文の製品数(カウント)。
  • 注文の顧客名。

問題はcustomers.nameを選択することです。それは集計関数でもグループ化でもないので、私はそれを直接選択することはできません。しかし、の1つしかないので、私はなぜそれを集約しなければならないのか分かりません。私はその名前を選択するには、このようなトリックを行うことができます。

SELECT MAX(customers.name) 

しかし、私は、「顧客のための名前を「注文に対する顧客の最大の名前を」たいがいないので、それは、汚いと思いますオーダー"。 そのようなことをするエレガントな方法は何ですか?

希望は重複していません。

EDIT:注文番号がorders.customer_idである注文が1人しかありません。だから私はなぜこのようなやり方をしなければならないのか尋ねるのです。 GROUP BY句に

+1

に順番をウィンドウ関数を使用することができますか?!? –

+0

はい。私は私の質問を編集する。 –

+1

そして 'GROUP BY orders.id、customers.name'の結果はあなたが望むものではありませんか? – jarlh

答えて

1

追加customers.name:通常

SELECT orders.id, customers.name, COUNT(order_product.id) 
FROM orders 
INNER JOIN order_product ON orders.id = order_product.order_id 
INNER JOIN customers ON orders.customer_id = customers.id 
GROUP BY orders.id, customers.name 

ことができます簡単に機能を設定するには、引数はありません選択されたすべての列でグループ!

1

代わりに、あなただけの一人の顧客を持っている

SELECT DISTINCT orders.id, customers.name, COUNT(order_product.id) OVER (PARTITION BY orders.id) 
FROM orders 
INNER JOIN products ON orders.id = order_product.order_id 
INNER JOIN customers ON orders.customer_id = customers.id; 
関連する問題