mysql 存在汇总差异

mysql with rollup discrepancy

我 运行 在 MySQL 中遇到了 WITH ROLLUP 的奇怪问题,我无法理解。我有一个餐厅订单数据库,它根据查询的组合方式在底部给我不同的总数。

以下查询计算正确,并使用 SUM(m.price*od.qty)

SELECT m.item_name, m.price, SUM(od.qty), COUNT(*), SUM(m.price*od.qty) 
FROM order_main AS om, order_detail AS od, menu as m 
WHERE od.menuid=m.menuid AND om.orderid=od.orderid AND om.order_date='2012-11-16' AND m.menuid<10 
GROUP BY m.menuid WITH ROLLUP;
+-------------------+-------+-------------+----------+---------------------+
| item_name         | price | SUM(od.qty) | COUNT(*) | SUM(m.price*od.qty) |
+-------------------+-------+-------------+----------+---------------------+
| Cheese Sticks     |  8.74 |          31 |       11 |              270.94 |
| Pepper Pasta      |  1.63 |          55 |       18 |               89.65 |
| Sambuca Puree     |  2.84 |          68 |       22 |              193.12 |
| Beef Tenderloin   |  2.52 |          48 |       16 |              120.96 |
| Pork Chops        |  5.37 |          53 |       18 |              284.61 |
| Sole Nole         |  2.13 |          65 |       18 |              138.45 |
| Nescafe Espresso  |  9.96 |          56 |       21 |              557.76 |
| Lettuce Wraps     |  8.35 |          57 |       21 |              475.95 |
| Bread with Butter |  9.36 |          55 |       19 |              514.80 |
| WITH ROLLUP       |  ---- |         488 |      164 |             2646.24 |
+-------------------+-------+-------------+----------+---------------------+

对于使用 m.price*SUM(od.qty) 的汇总,以下查询计算不正确。但其他一切都在 table.

SELECT m.item_name, m.price, SUM(od.qty), COUNT(*), m.price*SUM(od.qty) 
FROM order_main AS om, order_detail AS od, menu as m 
WHERE od.menuid=m.menuid AND om.orderid=od.orderid AND om.order_date='2012-11-16' AND m.menuid<10 
GROUP BY m.menuid WITH ROLLUP;
+-------------------+-------+-------------+----------+---------------------+
| item_name         | price | SUM(od.qty) | COUNT(*) | m.price*SUM(od.qty) |
+-------------------+-------+-------------+----------+---------------------+
| Cheese Sticks     |  8.74 |          31 |       11 |              270.94 |
| Pepper Pasta      |  1.63 |          55 |       18 |               89.65 |
| Sambuca Puree     |  2.84 |          68 |       22 |              193.12 |
| Beef Tenderloin   |  2.52 |          48 |       16 |              120.96 |
| Pork Chops        |  5.37 |          53 |       18 |              284.61 |
| Sole Nole         |  2.13 |          65 |       18 |              138.45 |
| Nescafe Espresso  |  9.96 |          56 |       21 |              557.76 |
| Lettuce Wraps     |  8.35 |          57 |       21 |              475.95 |
| Bread with Butter |  9.36 |          55 |       19 |              514.80 |
| WITH ROLLUP       |  ---- |         488 |      164 |             4567.68 |
+-------------------+-------+-------------+----------+---------------------+

我找不到任何关于 WITH ROLLUP 计算方式不同的原因,特别是因为每件商品的价格都是静态的。

您正在使用 MySQL 最棘手的功能之一:包括既不在分组依据中也不以某种方式聚合的字段。在您的情况下, m.price 和 MySQL 将使用它遇到的第一个值。这可能因任何原因在执行之间有所不同。在较新的版本中,这已默认禁用,因为它可能会导致这种意外结果。

所以你的第二个公式 m.price * SUM(od.qty) 本质上意味着: "For each group (menu item) take the first value you find for m.price and multiply that with the sum of the quantity in that group".

这对商品很有效,因为每个商品只有一个价格,但对于汇总,您会从整个数据集中获得一个随机价格。

通过说 "m.menuid, m.price" 或使用像 AVG() 这样的聚合来更正组。