加入两个包含 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() 子查询吗?我在寻找解决方案时找不到任何东西。

【问题讨论】:

您在子查询的selects 中缺少, 两个都修复了,很好的捕获。可悲的是,错误并不是那么简单。 请注意,即使您的查询没有抛出错误,它也不会处理已售出但未购买的情况,也不会正确处理以下情况物品被购买但未出售(因此左连接结果的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() 函数的子查询时出现无效操作错误的主要内容,如果未能解决你的问题,请参考以下文章

加入两个查询Oracle SQL时出现问题

映射 hbm 文件时出现错误“命名空间中的元素 'class' 具有无效的子元素 'set'”

CASE表达式总和-加入其他表时出现的问题

删除时出现中继错误:RelayMutationQuery:胖查询中的字段名称无效

Oracle DB - ORA-00904:选择时出现“无效标识符”错误

在查询结果上启动 foreach 循环时出现“不存在数据时尝试读取无效”