【发布时间】:2013-07-11 07:39:52
【问题描述】:
我有一个基于位置跟踪零售销售的数据库。我有一个带有 ID 和各种其他位置特定信息的位置表,一个带有 itemID 和所有其他项目信息的零售项目表,以及一个包含位置和项目 ID 以及其他信息的零售使用表销售(数量、销售价格等)。我正在尝试进行查询,该查询将返回所有零售商品以及在给定日期范围内按位置分组的每个商品的销售量总和。
我发现了this SO 问题,并在一定程度上模仿了 Tony Andrews 的回答,但它的行为与我预期的不同。
如果我不包括日期范围,我可以获得完整的商品列表(所有 29 件商品都按预期重新调整)和销售数量:
SELECT i.WholesaleCost, i.RetailPrice, i.OnHandQuan, u.ItemNo, AVG(u.Price) AS Price, SUM(u.Quantity) AS Quantity, l.Description, l.LocationID, i.Description AS ItemDescription
FROM Location as l CROSS JOIN RetailSaleItems as i
INNER JOIN RetailSaleUsage as u ON l.LocationID = i.LocationID AND i.ItemNo = u.ItemNo
WHERE (l.LocationID IN(1)) AND (i.Inactive = 0)
GROUP BY i.WholesaleCost, i.RetailPrice, i.OnHandQuan, u.ItemNo, l.[Description], l.LocationID, i.[Description]
ORDER BY l.[Description]
当我尝试限制日期范围时,比如到今年 1 月,我会丢失 5 条记录,并且尽我所能告诉它,因为它们没有在指定的日期范围内显示在 RetailSaleusage 表中。但这没有任何意义,因为还有 15 项其他项目也没有出现在该日期范围内,但它们出现在结果中。
我使用的日期范围的 SQL 是:
SELECT i.WholesaleCost, i.RetailPrice, i.OnHandQuan, u.ItemNo, AVG(u.Price) AS Price, SUM(u.Quantity) AS Quantity, l.Description, l.LocationID, i.Description AS ItemDescription
FROM Location as l CROSS JOIN RetailSaleItems as i
INNER JOIN RetailSaleUsage as u ON l.LocationID = i.LocationID AND i.ItemNo = u.ItemNo
WHERE (l.LocationID IN(1))
AND (i.Inactive = 0) AND (u.[Date] >= '1/1/2013' AND u.[Date] <= '1/31/2013')
GROUP BY i.WholesaleCost, i.RetailPrice, i.OnHandQuan, u.ItemNo, l.[Description], l.LocationID, i.[Description]
ORDER BY l.[Description]
我在 MSDN 上找到了 this 文章,该文章讨论了交叉联接在包含 where 子句时的作用类似于内部联接,但其中一个 cmets 指出仅当 where 规定联接标准时才适用。由于我的 SQL 的 where 只是限制了日期范围,我认为这不是问题。
对此的任何指导将不胜感激。
【问题讨论】:
标签: sql