具有汇总差异的mysql

w6lpcovy  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(359)

我遇到了一个奇怪的问题 WITH ROLLUP 在mysql中,我很难理解。我有一个餐馆的订单数据库,它在底部根据查询的组合方式给我不同的总数。
下面的查询计算正确,并使用 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计算不同的原因,特别是因为每个项目的价格都是静态的。

3zwjbxry

3zwjbxry1#

您使用的是mysql最棘手的特性之一:包括既不在groupby中也不以某种方式聚合的字段。在您的例子中,即m.price和mysql将使用它遇到的第一个值。这可能因任何原因而在执行之间有所不同。在较新的版本中,这在默认情况下已被禁用,因为它可能会导致这种意外的结果。
所以你的第二个公式,m.price*sum(od.qty)本质上意味着:“对于每个组(菜单项),取你为m.price找到的第一个值,然后乘以该组中的数量之和。”。
这对于项目很有效,因为每个项目只有一个价格,但是对于汇总,您可以从整个数据集中获得一个随机价格。
更正groupby中的“m.menuid,m.price”或使用avg()之类的聚合。

相关问题