なぜcustomer_numbとcost_line(sum()を使用して支出額を計算する)を単純にグループ化できないのか、頭を悩ませているようには見えません。
group by customer_numb
customer_numbがcustomerテーブルの行を一意に識別することがわかっている場合(customer_numbがプライマリキーまたは代替キーのいずれかであると想定)、任意の指定された値はとcustomers.customer_numb
の値が1つだけになります。しかし、解析時には、Oracleはそれを認識していないか、少なくともそれを認識していないように動作します。そして、少しパニックに陥って、「シングルに複数の値がある場合はどうすればよいですか?」と書かれています。customers.customer_first_name
customers.customer_last_name
customer_numb
customer_first_name
大まかに言うと、句内の式はselect
句内の式を使用しgroup by
たり、集計関数を使用したりできます。(ベーステーブルなどに依存しない定数やシステム変数も同様です。)そして、「使用する」とは、式または式の一部を意味します。したがって、名と名前でグループ化customer_first_name || customer_last_name
すると、有効な式にもなります。
主キーでグループ化されているようなテーブルがある場合customers
、または一意のキーがありnull制約ではない列がある場合は、それらをgroup by
句に安全に含めることができます。この特定の例では、group by customer.customer_numb, customer.customer_first_name, customer.customer_last_name.
また、グループの値がorder by
1つではないため、最初のクエリのは失敗することに注意してください。句で列エイリアスを注文または使用して、そのorder_lines.cost_line
上で注文することができますsum(order_lines.cost_line)
select
alias
SELECT orders.customer_numb,
sum(order_lines.cost_line),
customers.customer_first_name,
customers.customer_last_name
FROM orders
INNER JOIN customers ON customers.customer_numb = orders.customer_numb
INNER JOIN order_lines ON order_lines.order_numb = orders.order_numb
GROUP BY orders.customer_numb,
customers.customer_first_name,
customers.customer_last_name
ORDER BY sum(order_lines.cost_line)
また
SELECT orders.customer_numb,
sum(order_lines.cost_line) as sum_cost_line,
. . .
ORDER BY sum_cost_line
注:一部のRDBMSは、明示的に指定されていなくても、グループ化のための追加の式を意味すると聞いています。OracleはそれらのRDBMSの1つではありません。
両方によるグループ化については、2人の顧客がいるDBcustomer_numb
をcost_line
考えてみましょう。1と2は、それぞれ1行ずつ2つの注文があります。
Customer Number | Cost Line
1 | 20.00
1 | 20.00
2 | 35.00
2 | 30.00
select customer_number, cost_line, sum(cost_line)
FROM ...
group by customer_number, cost_line
order by sum(cost_line) desc
Customer Number | Cost Line | sum(cost_line)
1 | 20.00 | 40.00
2 | 35.00 | 35.00
2 | 30.00 | 30.00
最も高い最初の行sum(cost_line)
は、最も多くを費やした顧客ではありません。