访问VBA如何使用Union ALL语句

时间:2017-05-21 01:58:59

标签: vba ms-access

我的UNION ALL声明没有返回我希望的内容。我将产品放入一个位置(73)并将它们从同一位置取出。我想知道有多少人留在那个地方。我试图通过添加金额并减去金额来计算出来。我将我的交易存储在tblWarehouseTransfer中 我希望每个产品都有一行总数。我得到的是一条线,其中包含放入该位置的金额之和以及一条线,其中包含取出金额的总和(作为负数)。
我正在使用列表框显示我所有产品的列表。

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))" 

有人可以帮助我加入'in'和'out'作为一个整体。

1 个答案:

答案 0 :(得分:0)

此示例连接两个子查询,这两个子查询允许将两个不同的总和一起添加,而UNION仅一起列出两个查询的行。

子查询的一个缺点是它无法在查询设计视图中完全编辑...它需要SQL视图来编辑整个事物。但是,您可以单独保存每个子查询,然后在第三个查询中将这些查询连接在一起。然后,您可以在“设计视图”中单独编辑每个零件。

另请注意,我将HAVING子句更改为WHERE子句。如果您在之前将标准应用于,那么WHERE子句可以更有效率。它们被聚合(即分组和求和)。 聚合数据后,HAVING应用标准。如果标准涉及聚合表达式,则它们必须出现在HAVING子句中。

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

编辑:更改为LEFT JOIN并在调用nz()时在TotalSum中处理NULL。

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是主键,并且ProductName对每个ProductID都是唯一的。如果不是这样,您将需要更改外部查询ON表达式以匹配ProductName值(即添加AND ToQuery.ProductName = FromQuery.ProductName)。