加入两个包含 SUM() 函数的子查询时出现无效操作错误
Posted
技术标签:
【中文标题】加入两个包含 SUM() 函数的子查询时出现无效操作错误【英文标题】:Invalid Operation error from joining two subqueries containing SUM() functions 【发布时间】:2015-10-19 20:00:05 【问题描述】:假设(假设)我继承了一个数据库,并且在这个数据库中有一个表来跟踪我的特许摊位中的库存,[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
,一次用于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()
子查询吗?我在寻找解决方案时找不到任何东西。
【问题讨论】:
您在子查询的select
s 中缺少,
两个都修复了,很好的捕获。可悲的是,错误并不是那么简单。
请注意,即使您的查询没有抛出错误,它也不会处理已售出但未购买的情况,也不会正确处理以下情况物品被购买但未出售(因此左连接结果的Q2.QuantityOut
将是NULL
)。
【参考方案1】:
当您说您无法将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
【讨论】:
这个想法以前曾在我脑海中闪过,但由于Flag
字段在全面问题中要复杂得多(几乎没有原因),所以我犹豫不决。我认为这可能比我最初想象的要容易。不过,我明天必须回到这个话题。谢谢大家的帮助!以上是关于加入两个包含 SUM() 函数的子查询时出现无效操作错误的主要内容,如果未能解决你的问题,请参考以下文章
映射 hbm 文件时出现错误“命名空间中的元素 'class' 具有无效的子元素 'set'”
删除时出现中继错误:RelayMutationQuery:胖查询中的字段名称无效