访问VBA如何使用Union ALL语句

Access VBA How to use a Union ALL statement

我的工会声明没有像我希望的那样返回。我将把产品放在一个位置(73),并将它们从同一位置取出。我想知道那个地方还有多少人。我想把这个数加起来,再减去这个数。我将我的交易存储在tblwarehousetransfer中。我想每种产品都有一行,总共是多少。我得到的是一行加上放入位置的数量之和,一行加上取出的数量之和(负数)。我正在使用列表框显示我所有产品的列表。

1
2
3
4
5
6
7
8
Me.lstCutWipers.RowSource ="SELECT tblProducts.ProductID, tblProducts.ProductName, Sum(tblWarehouseTransfer.Qty) AS SumOfQty" _
            &" FROM tblWarehouseTransfer INNER JOIN tblProducts ON tblWarehouseTransfer.ProductID = tblProducts.ProductID" _
            &" GROUP BY tblProducts.Productid, tblProducts.ProductName, tblWarehouseTransfer.LocationTo" _
            &" HAVING (((tblWarehouseTransfer.LocationTo) = 73))" _
            &" UNION ALL SELECT tblProducts.ProductID, tblProducts.ProductName, -Sum(tblWarehouseTransfer.Qty) AS SumOfQty" _
            &" FROM tblWarehouseTransfer INNER JOIN tblProducts ON tblWarehouseTransfer.ProductID = tblProducts.ProductID" _
            &" GROUP BY tblProducts.Productid, tblProducts.ProductName, tblWarehouseTransfer.LocationFrom" _
            &" HAVING (((tblWarehouseTransfer.LocationFrom)= 73))"

有人能帮我把"进"和"出"加在一起吗?


此示例联接两个子查询,这允许将两个不同的和添加到一起,而联合只将两个查询的行一起列出。

子查询的一个缺点是它不能在查询设计视图中完全编辑…它需要SQL视图来编辑整个事件。但是,您可以分别保存每个子查询,然后将这些查询连接到第三个查询中。然后可以在设计视图中分别编辑每个零件。

还要注意,我把HAVING子句改成了WHERE子句。如果在对源值进行聚合(即分组和求和)之前对它们应用条件,那么WHERE子句的效率会更高。在聚合数据后应用条件。如果条件涉及聚合表达式,那么它们必须出现在HAVING子句中。

通过改为WHERE子句,它还意味着您不必在该字段上分组。速度的差异可以忽略不计,它应该返回相同的信息,但这是不必要的,因为对该查询有贡献的每一行都将只针对WHERE子句中的值。请注意,如果您完全更改了查询,则需要考虑应用条件的适当子句。

编辑:更改为左联接,并在totalsum中处理了空值,并调用nz()。

1
2
3
4
5
6
7
8
9
10
11
12
SELECT ToQuery.ProductID, ToQuery.ProductName, (ToQuery.SumOfQty + nz(FromQuery.SumOfQty, 0.0)) As TotalSum
FROM
  (SELECT tblProducts.ProductID, tblProducts.ProductName, Sum(tblWarehouseTransfer.Qty) AS SumOfQty
  FROM tblWarehouseTransfer INNER JOIN tblProducts ON tblWarehouseTransfer.ProductID = tblProducts.ProductID
  WHERE tblWarehouseTransfer.LocationTo = 73
  GROUP BY tblProducts.Productid, tblProducts.ProductName) AS ToQuery
LEFT JOIN
  (SELECT tblProducts.ProductID, tblProducts.ProductName, -Sum(tblWarehouseTransfer.Qty) AS SumOfQty
  FROM tblWarehouseTransfer INNER JOIN tblProducts ON tblWarehouseTransfer.ProductID = tblProducts.ProductID
  WHERE tblWarehouseTransfer.LocationFrom = 73
  GROUP BY tblProducts.Productid, tblProducts.ProductName) AS FromQuery
ON ToQuery.ProductID = FromQuery.ProductID

要完成此操作,假定productID是主键,并且productID对每个productID都是唯一的。如果不是这样,则还需要更改表达式的外部查询以匹配产品名称值(即添加AND ToQuery.ProductName = FromQuery.ProductName)。