连接包含SUM()函数

时间:2015-10-19 20:00:06

标签: sql join sum ms-access-2007

假设(假设)我继承了一个数据库,并且在这个数据库中有一个表来跟踪我的特许摊位中的库存,[Purchases]计算我购买的库存以及我的客户所做的购买。它远非最佳解决方案,但它存在,我无法改变它。

[Purchases]内,有标记表示更改(库存购买或库存已售出),我可以查询表格,仅查看购买或销售情况,甚至可以通过SUM()查看总数(每个项目,时间段等)很容易。

该表可能看起来像这样:

   Date    |   Flag   |  ItemNum  |   Item Name   |  Quantity  |  Unit Price
10/19/2015    SOLD         001       SNICKERS        2            $1.00
10/19/2015    BOUGHT       001       SNICKERS        72           $0.40
10/18/2015    SOLD         034       GATORADE24OZ    3            $2.00
10/18/2015    SOLD         021       PRETZEL         1            $2.00
...

使用这些数据很容易,但是如果我想在一个时间范围内看到每个项目的库存变化,我可能会查询该表两次(一次用于SOLD,一次用于{{ 1}})。

BOUGHT
然而,

然后吐出SELECT Q1.ItemNum, Q1.QuantityIn, Q2.QuantityOut, (Q1.QuantityIn - Q2.QuantityOut) AS QuantityRem FROM ( SELECT ItemNum, SUM(Quantity) AS QuantityIn FROM Purchases WHERE Flag LIKE "BOUGHT" GROUP BY ItemNum ) AS Q1 LEFT JOIN ( SELECT ItemNum, SUM(Quantity) AS QuantityOut FROM Purchases WHERE Flag LIKE "SOLD" GROUP BY ItemNum ) AS Q2 ON Q1.ItemNum = Q2.ItemNum 而不是期望的结果。这两个子查询都可以自行运行,如果我先将一个子查询放入表中,那么主查询就可以工作。

当然有其他方法可以解决这个问题,但假设在我的非假设情况下,我无法使Invalid Operation.数量为负数,SOLD子查询,并在之后取总和,我唯一的选择使用临时表?由于某种原因加入Jet中不支持的两个UNION子查询?在寻找解决方案时,我无法找到任何结果。

1 个答案:

答案 0 :(得分:2)

如果您说您无法使SOLD数量为负数,我认为您的意思是您不得更改基表中的数量。但是,这并不排除在查询中更改它们。 Access不支持标准SQL CASE表达式,但它支持其他条件表达式。因此,您可以尝试以下几点:

SELECT
    ItemNum,
    SUM(IIF(flag = 'BOUGHT', quantity, 0)) AS QuantityIn,
    SUM(IIF(flag <> 'BOUGHT', quantity, 0)) AS QuantityOut,
    SUM(IIF(flag = 'BOUGHT', quantity, -quantity)) AS QuantityChange
FROM Purchases
GROUP BY ItemNum