2
mysql> select * from orders;
+---------+------------+------------+------------+----------+----------+
| orderid | customerid | orderdate  | shipdate   | shipping | salestax |
+---------+------------+------------+------------+----------+----------+
|       1 |          1 | 2008-03-31 | 2008-03-31 |     4.99 |     5.00 | 
|       2 |          1 | 2008-04-01 | 2008-04-02 |     5.99 |     5.00 | 
|       3 |          2 | 2008-04-01 | 2008-04-02 |     3.99 |     6.00 | 
|       4 |          3 | 2008-04-02 | 2008-04-02 |     6.99 |     7.50 | 
+---------+------------+------------+------------+----------+----------+
4 rows in set (0.02 sec)
mysql> select * from orderinfo;
+---------+------------+-----+-------+----------+
| orderid | isbn       | qty | price | detailid |
+---------+------------+-----+-------+----------+
|       1 | 0929306279 |   1 | 29.95 |        1 | 
|       1 | 0929306260 |   1 | 49.95 |        2 | 
|       2 | 0439357624 |   3 | 16.95 |        3 | 
|       3 | 0670031844 |   1 | 34.95 |        4 | 
|       4 | 0929306279 |   1 | 29.95 |        5 | 
|       4 | 0929306260 |   1 | 49.95 |        6 | 
|       4 | 0439357624 |   1 | 16.95 |        7 | 
|       4 | 0670031844 |   1 | 34.95 |        8 | 
+---------+------------+-----+-------+----------+
8 rows in set (0.00 sec)

orderinfoテーブルから数量と価格を乗算しようとすると、それらを乗算しようとすると注文テーブルから送料を追加しますが、正常に機能しますが、送料を追加すると誤った値が表示されます

これは動作します

mysql> select orders.orderid,sum(orderinfo.qty*orderinfo.price) as order_total from orders
    -> inner join orderinfo
    -> on orders.orderid=orderinfo.orderid
    -> group by orderid;
+---------+-------------+
| orderid | order_total |
+---------+-------------+
|       1 |       79.90 | 
|       2 |       50.85 | 
|       3 |       34.95 | 
|       4 |      131.80 | 
+---------+-------------+
4 rows in set (0.00 sec)

これは間違った値を与えます

mysql> select orders.orderid,sum(orderinfo.qty*orderinfo.price+orders.shipping) as order_total from orders
    -> inner join orderinfo
    -> on orders.orderid=orderinfo.orderid
    -> group by orderid;
+---------+-------------+
| orderid | order_total |
+---------+-------------+
|       1 |       89.88 | 
|       2 |       56.84 | 
|       3 |       38.94 | 
|       4 |      159.76 | 
+---------+-------------+
4 rows in set (0.00 sec)
4

1 に答える 1

2

後で実際に追加する必要がある場合は、集計内のshippingレートをの結果に適用します。これには、集約されたグループの各行に値を追加する効果があります。つまり、場合は2倍の送料、の場合は4倍の送料です。SUM()SUM()shippingorderid = 1orderid = 4

これを行うには、に追加shippingしますGROUP BY(実際には、MySQLはこれを必要としませんが、これは良い習慣です)。

SELECT
  orders.orderid,
  /* Add `shipping` outside the SUM() aggregate */
  SUM(orderinfo.qty*orderinfo.price) + orders.shipping AS order_total 
FROM orders
  INNER JOIN orderinfo ON orders.orderid = orderinfo.orderid
GROUP BY
  orderid,
  shipping

これがSQLFiddle.comの例です。

于 2012-12-09T00:05:58.790 に答える