2012-04-19 7 views
1

私は前にSUM(a * b)を見たことがありません。私は誰かが私の意図した動作を教えてくれることを願っています。もしそれがSQL標準の一部であったり、MySQLが実装しているものであれば。例:SUM(a * b)とは何ですか?

localhost test> CREATE TABLE numbers (id int not null primary key auto_increment, a int, b int); 
Query OK, 0 rows affected (0.03 sec) 

localhost test> INSERT INTO numbers (a,b) VALUES (1, 2), (3,4),(1,1),(5,6); 
Query OK, 4 rows affected (0.00 sec) 
Records: 4 Duplicates: 0 Warnings: 0 

localhost test> select * FROM numbers GROUP BY id; 
+----+------+------+ 
| id | a | b | 
+----+------+------+ 
| 1 | 1 | 2 | 
| 2 | 3 | 4 | 
| 3 | 1 | 1 | 
| 4 | 5 | 6 | 
+----+------+------+ 
4 rows in set (0.00 sec) 

localhost test> select SUM(a), SUM(b) FROM numbers GROUP BY id; 
+--------+--------+ 
| SUM(a) | SUM(b) | 
+--------+--------+ 
|  1 |  2 | 
|  3 |  4 | 
|  1 |  1 | 
|  5 |  6 | 
+--------+--------+ 
4 rows in set (0.00 sec) 

localhost test> select SUM(a*b), SUM(a), SUM(b) FROM numbers GROUP BY id; 
+----------+--------+--------+ 
| SUM(a*b) | SUM(a) | SUM(b) | 
+----------+--------+--------+ 
|  2 |  1 |  2 | 
|  12 |  3 |  4 | 
|  1 |  1 |  1 | 
|  30 |  5 |  6 | 
+----------+--------+--------+ 
4 rows in set (0.00 sec) 

localhost test> alter table numbers add col2 int not null; 
Query OK, 4 rows affected (0.03 sec) 
Records: 4 Duplicates: 0 Warnings: 0 

localhost test> update numbers set col2 = id %2; 
Query OK, 2 rows affected (0.00 sec) 
Rows matched: 4 Changed: 2 Warnings: 0 

localhost test> select col2, SUM(a*b), SUM(a), SUM(b) FROM numbers GROUP BY col2; 
+------+----------+--------+--------+ 
| col2 | SUM(a*b) | SUM(a) | SUM(b) | 
+------+----------+--------+--------+ 
| 0 |  42 |  8 |  10 | 
| 1 |  3 |  2 |  3 | 
+------+----------+--------+--------+ 
2 rows in set (0.01 sec) 

I 80と最後の行30、またはそれが(私はSQL_MODE = ONLY_FULL_GROUP_BYが有効になっている)の行を選ぶのMySQLの非標準的な挙動を用いる場合に生成されたエラーを期待しているであろう。

答えて

6

SUM(a*b)は完全に有効な標準SQLです。各行に対してa * bを計算し、各グループ内(またはGROUP BYが指定されていない場合はテーブル全体)の結果を合計します。

 
+----+------+------+------+-----+ 
| id | col2 | a | b | a*b | 
+----+------+------+------+-----+ 
| 1 | 1 | 1 | 2 | 2 |     
| 2 | 0 | 3 | 4 | 12 | --+ 
| 3 | 1 | 1 | 1 | 1 | |---> 12 + 30 = 42 
| 4 | 0 | 5 | 6 | 30 | --+ 
+----+------+------+------+-----| 

それはSUM(a) * SUM(b)と同じではありません。

+0

驚くばかりです。ありがとうございます! –

関連する問題