2013-02-22 59 views
0

我有一个MySQL数据库三个相关表:SUM()的多个值相关表

  • inventory_items定义仓库物品的种类
  • inventory_transactions定义广告的添加或删除
  • 数量
  • 的位置上确定的位置说库存

Inventory_transactions有许多存储在给定inventory_item如何添加或删除一个quantity_offset从给定的位置。

我有以下查询,它将获得global_quantity(给定inventory_item_id的所有quantity_offsets的总和)以及location_quantity,只要知道位置ID,它就可以为特定位置执行相同的操作。

SELECT sku, name, SUM(quantity_offset) AS global_quantity, 
(
SELECT SUM(quantity_offset) 
    FROM inventory_transactions 
    WHERE inventory_items.inventory_item_id = inventory_transactions.inventory_item_id AND inventory_transactions.location_id = 1 
) AS location_quantity 
FROM inventory_items 
JOIN inventory_transactions ON inventory_items.inventory_item_id = inventory_transactions.inventory_item_id 
GROUP BY sku 

我想用被添加到每个位置的列结束了,所以结果可能有值,例如:

sku, name, global_quantity, denver_quantity, dallas_quantity, ft_wayne_quantity 

我的回退是要做到这一点对个人inventory_item页面(当我就知道库存物品,可以通过定位组),但能做到在一个单一的查询,并把它全部纳入一个表将是非常巨大的。

起初,我以为我可以通过迭代子查询,但无法设置列名(AS)编程。

非常感谢您提供任何帮助。

回答

1

顺便说一句,而不是使用子查询SELECT列表中,你可以得到与上如果行是从给定的位置,有条件地返回quantity_offset的计算式的SUM聚合相同的结果。我也将使用左外连接到inventory_transactions表,这样我就一定要得到一个回行的每一行中inventory_items:

SELECT i.sku 
    , i.name 
    , SUM(t.quantity_offset) AS global_quantity 
    , SUM(IF(t.location_id = 1,t.quantity_offset,NULL)) AS location_1_quantity 
    FROM inventory_items i 
    LEFT 
    JOIN inventory_transactions t ON i.inventory_item_id = t.inventory_item_id 
    GROUP BY i.sku 

(这不回答你的问题,但我想让你意识到这一点)。

要回答你的问题,首先,SELECT语句无法动态地改变它在结果集中返回的列的数量或类型。你需要定义你想返回的每一列的表达式。 (在SQL SELECT statment文字的产生可动态完成,产生特定的SELECT语句,而是由SELECT语句返回的列由SELECT语句固定。)

如果我有一个相对固定的LOCATION_ID价值观,我需要的结果集指定,我会重复的条件表达式多次的总和,每进行一次位置或什么的,我想位置设置:

SELECT i.sku 
    , i.name 
    , SUM(t.quantity_offset) AS global_quantity 
    , SUM(IF(t.location_id = 1,t.quantity_offset,NULL)) AS location_1_quantity 
    , SUM(IF(t.location_id = 2,t.quantity_offset,NULL)) AS location_2_quantity 
    , SUM(IF(t.location_id = 3,t.quantity_offset,NULL)) AS location_3_quantity 
    , SUM(IF(t.location_id IN (1,2,3),t.quantity_offset,NULL)) AS location_123_quantity 
    , SUM(IF(t.location_id = 4,t.quantity_offset,NULL)) AS location_4_quantity 
    FROM inventory_items i 
    LEFT 
    JOIN inventory_transactions t ON i.inventory_item_id = t.inventory_item_id 
    GROUP BY i.sku 

如果要返回的列的集合需要真正动态,那么我不会将它们作为列返回。相反,我会将每个位置的SUM(quantity_offset)作为单独的行返回,然后在客户端处理转换为列式表示。

+0

谢谢!基于我知道查询运行前的位置数(但不是在写入时)的事实,我想我会尝试在应用程序接触数据库之前生成SELECT。在select中添加可变数量的条件和应该很好。 – 2013-02-25 17:36:19

0

试试这个

SELECT sku, name, SUM(quantity_offset) AS global_quantity, 
     (
     SELECT SUM(quantity_offset) 
     FROM inventory_transactions 
      WHERE inventory_items.inventory_item_id = inventory_transactions.inventory_item_id AND inventory_transactions.location_id = 1 
      AND location = denver) AS denver_quantity , 
     (
     SELECT SUM(quantity_offset) 
     FROM inventory_transactions 
      WHERE inventory_items.inventory_item_id = inventory_transactions.inventory_item_id AND inventory_transactions.location_id = 1 
      AND location = dallas) AS dallas_quantity, 
     (
     SELECT SUM(quantity_offset) 
     FROM inventory_transactions 
      WHERE inventory_items.inventory_item_id = inventory_transactions.inventory_item_id AND inventory_transactions.location_id = 1 
      AND location = ft_wayne) AS ft_wayne_quantity 
    FROM inventory_items 
    JOIN inventory_transactions ON inventory_items.inventory_item_id = inventory_transactions.inventory_item_id 
    GROUP BY sku 

注意我用了location作为列名我不知道你有什么位置的列名,只是更换

1

您应该使用有条件的资金 - 这是最有效的方式(最快的查询)我知道的:

SELECT sku, name, SUM(quantity_offset) AS global_quantity, 
    sum(case when inventory_transactions.location_id = 1 then quantity_offset else 0 end) as loc1_quantitity, 
    sum(case when inventory_transactions.location_id = 2 then quantity_offset else 0 end) as loc2_quantitity, 
    sum(case when inventory_transactions.location_id = 3 then quantity_offset else 0 end) as loc3_quantitity 
FROM inventory_items JOIN inventory_transactions ON inventory_items.inventory_item_id = inventory_transactions.inventory_item_id 
GROUP BY sku 
+0

我不知道有条件的总和。直到现在,我已经选择了数据,并以相对的方式显示它(存储的方式相同)。感谢你的分享! – 2013-02-25 17:36:58