我需要从打开的订单中获取销售数据,按代码排序。物料在库存表中按批号分隔(出于可追溯性原因),但批号不会出现在订单表中。 2个表之间的唯一链接是部件号。
我的查询
SELECT代码,SUM(qty * price)AS Sales 来自订单INNER JOIN库存ON orders.partno = stock.partno GROUP BY代码
开始返回奇怪的结果(给定代码的销售数字非常高),我将其更改为
SELECT DISITNCT orders.partno,stock.lot,stock.code 来自订单INNER JOIN库存ON orders.partno = stock.partno
并注意到,如果某个给定零件的批次有库存,则全部退回
第1部分LotA代码
Part1 LotB代码
Part1 LotC代码
这意味着如果客户订购300单位的Part1,我的查询将返回900,我的销售数字将乘以3.
我该如何解决这个问题?
必须注意的是,我不是从数据库中工作,而是从一组表中工作,其结构有时可能是异想天开的。
答案 0 :(得分:0)
在编写查询时,您应该使用table.column或alias.column引用。正如您的问题所示,我们不知道PRICE来自哪个表...零件表或批表。如果您正在处理库存跟踪(例如FIFO或LIFO方法会计),则必须与批次表关联以跟踪/销售库存。
现在,为什么你会得到大数字?这是因为笛卡尔结果。如果你不熟悉它,对于一个表中连接到另一个表的每个记录,它会返回许多匹配。
因此,如果您有一个订单项的订单,则产品可用表中只有一个订单项。所以这是简单的1:1比例。现在,您的STOCK表可以具有完全相同部件号的多个记录。您现在为Stock表中的EACH LOT ENTRY返回相同的原始订单行项目。所以现在,对于你的1项,你得到3个批次(1:3结果)。
我知道这从商品销售成本的基础上很重要,因此您需要知道它加入了哪个“批次”,这样您才能获得适当定价的特定记录。
但是,如果您拥有所有销售产品的通用产品表,并且该表具有通用的普通价格,无论销售使用哪个“批次”,我都会加入该表而不是您的报告。但是你仍然会有库存,商品成本等的会计问题。