通过3个表进行计算,求和和分组

马塞尔

我有4个表格:项目,订单,inventory_item和库存。它们的结构如下:

 _________         ____________         ________________         _____________
| orders  | >---- |  items     | ----< | inventory_item | >---- | inventories |
|- - - - -|       |- - - - - - |       |- - - - - - - - |       |- - - - - - -|
|+item_id |       |+id         |       |+id             |       |+id          |
|+amount  |       |+group_id   |       |+inventory_id   |        -------------
 ---------        |+worth      |       |+item_id        |       
                  |+min_amount |       |+amount         |
                   ------------         ----------------

无需查询库存表,仅显示该表是为了了解结构。

我想使用一个与MariaDB兼容的sql查询,并执行以下操作:按清单和group_id显示分组:

  • SUM(订单金额)
  • SUM(items.min_amount)
  • 总和(inventory_item.amount)
  • 总和(items.worth * stock_item.amount)

我试图通过子查询来解决这个问题,但这似乎是没有希望的。我目前的尝试如下所示:

SELECT
    `inventory_item`.`inventory_id`,
    `items`.`group_id`,
    SUM(`items`.`min_amount`),
    SUM(`inventory_item`.`amount`),
    SUM(`inventory_item`.`amount` * `items`.`worth`),
    SUM(`orders`.`amount`)
FROM `items`
INNER JOIN `inventory_item` ON `items`.`id` = `inventory_item`.`item_id`
LEFT JOIN `orders` ON `items`.`id` = `orders`.`item_id`
GROUP BY
    `inventory_item`.`inventory_id`,
    `items`.`group_id`

SUM(orders.amount)值实际上是正确的,但其他值是错误的,因为一项被多次计数。

我知道如何用多个查询来解决这个问题,但是我只想用一个(兼容MariaDB的)SQL查询来解决。知道怎么做吗?

戈登·利诺夫

您需要沿着一个维度预先汇总结果。认为您可以通过预先聚合来做到这一点orders

SELECT ii.inventory_id, i.group_id,
       SUM(i.min_amount),
       SUM(ii.amount),
       SUM(ii.amount * i.worth),
       SUM(i.amount)
FROM items i JOIN
     inventory_item ii
     ON i.id` = ii.item_id LEFT JOIN
     (SELECT o.item_id, SUM(o.amount) as amount
      FROM orders o
      GROUP BY o.item_id
     ) o
     ON o.item_id = i.id
GROUP BY ii.inventory_id, i.group_id

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章