MySQL сумма подзапроса, содержащего соединение - PullRequest
1 голос
/ 07 октября 2011

У меня есть таблица, содержащая запасы в форме

ID |Product ID | Movement |  Cumulative Quantity | Store ID
=================================================|=========
1  | 1         |  100     |  100                 |  1 
2  | 1         |  -4      |  96                  |  1
3  | 1         |  -1      |  95                  |  1
4  | 2         |  100     |  100                 |  1
5  | 1         |  100     |  100                 |  2

Каждая строка в основном имеет движение запаса, а последняя строка MAX (ID) содержит cumulative_quantity, которая содержит доступный запас

Другая таблица, содержащая продукты

ID | Product Name
====================
1  | Apple Juice
2  | Orange Juice

Я ищу вывод в виде

Product ID | Product Name | Total Quantity at all stores
========================================================
1          | Apple Juice  | 195
2          | Orange Juice | 100

Это упрощенная версия следующей таблицы

Store ID   | Product ID | Product Name | Cumulative Quantity
========================================================
1          | 1          | Apple Juice  | 95
1          | 2          | Orange Juice | 100
2          | 1          | Apple Juice  | 100
2          | 2          | Orange Juice | 0

Ответы [ 3 ]

3 голосов
/ 07 октября 2011

Это относительно простой SUM() агрегат с JOIN. SUM(Movement) приведет к общему количеству, доступному во всех магазинах.

SELECT
  inventories.productId,
  productName,
  SUM(Movement) AS `Total Quantity`
FROM inventories JOIN  products ON inventories.productId = products.productId
GROUP BY inventories.productId, productName
2 голосов
/ 07 октября 2011

Есть несколько способов сделать это, вот один

Подзапрос в предложении From с использованием MAX

SELECT products.id as `Product ID`,  
       products.`Product Name`, 
       SUM(inventory.`Cumulative Quantity`) as Total Quantity at all stores
FROM products
     INNER JOIN inventory
     ON products.`id` = inventory.`id`
     INNER JOIN 
     (
     SELECT ( max(`id`)  as `id`,
              `product id`,
              `store id`
     FROM 
           `inventory`
     GROUP BY
              `product id`,
              `store id`) maxinventory
     ON inventory.`id` = maxinventory.`id`
GROUP BY
      products.`id`,  
       products.`Product Name`

Вот еще один с использованием IN

SELECT products.id as `Product ID`,  
       products.`Product Name`, 
       SUM(inventory.`Cumulative Quantity`) as Total Quantity at all stores
FROM products
     INNER JOIN inventory
     ON products.`id` = inventory.`id`
WHERE
      inventory.`id ` IN
     (
     SELECT ( max(`id`)  as `id`,
     FROM 
           `inventory`
     GROUP BY
              `product id`,
              `store id`) 
GROUP BY
      products.`id`,  
       products.`Product Name`
0 голосов
/ 07 октября 2011

Хитрость заключается в том, чтобы использовать подзапрос, чтобы найти текущие записи инвентаря, то есть те, которые имеют максимум id для каждой пары product_id, store_id:

SELECT
  product_id, name, SUM( cumulative_qty ) AS total_qty
FROM
  (SELECT MAX(id) AS id FROM inventories GROUP BY product_id, store_id) AS cur
  NATURAL JOIN inventories
  JOIN products ON products.id = inventories.product_id
GROUP BY product_id

(Кстати, я подозреваю, что вы хотите, чтобы индекс на inventories (product_id, store_id, id) делал этот запрос достаточно эффективным. И, конечно, я предполагаю, что столбцы id являются первичными ключами.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...