假设(假设)我继承了一个数据库,并且在这个数据库中有一个表来跟踪我的特许摊位中的库存,[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
子查询?在寻找解决方案时,我无法找到任何结果。
答案 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