2015-10-19 33 views
0

假设(假设)我继承了一个数据库,并且在此数据库中有一个表用于跟踪我的特许展位中的库存,[Purchases]计数我购买的库存以及我的顾客制造。这远非最佳解决方案,但它是存在的,我无法改变它。加入包含SUM()函数的两个子查询时的操作错误

[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,一次为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量负,UNION子查询,并采取总和事后,是我对使用临时表的唯一选择?由于某些原因,在Jet中不支持两个SUM()子查询?在搜索解决方案时,我找不到任何东西。

+1

你缺少','在子查询的'select's –

+0

两个固定,良好的渔获:因此,你可以尝试沿着这些路线的东西。可悲的是,这个错误并不那么简单。 – Fritz

+0

请注意,即使您的查询没有发生错误,它也不会处理商品被出售但未被购买的情况,并且它不能正确处理商品被购买但未被出售的情况(所以'Q2。 QuantityOut'的左连接结果将是'NULL')。 –

回答

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 
+0

这个想法之前我曾经想过,但由于在全面问题中“Flag”字段更复杂(没有多少理由),所以我很犹豫。我认为这可能比我原先想的要容易。但明天我必须回到这里。谢谢你的帮助! – Fritz