Mysql SQL计数计数两次
我在SQL语句方面遇到了问题,对SQL没有太多的经验,已经走到了死胡同。我正在尝试返回已拾取的项目数和要拾取的项目数。该语句的工作原理是它返回一个计数,但计数是它应该的两倍,即1作为2等。有人能指出我遗漏了什么吗Mysql SQL计数计数两次,mysql,sql,sql-server,Mysql,Sql,Sql Server,我在SQL语句方面遇到了问题,对SQL没有太多的经验,已经走到了死胡同。我正在尝试返回已拾取的项目数和要拾取的项目数。该语句的工作原理是它返回一个计数,但计数是它应该的两倍,即1作为2等。有人能指出我遗漏了什么吗 SELECT b.BoxID AS BoxID ,p.productCode AS ProductCode ,ol.ProductID AS ProductID ,COUNT(OI.Picked) AS PickCount ,COUNT(OI.[Iden
SELECT b.BoxID AS BoxID
,p.productCode AS ProductCode
,ol.ProductID AS ProductID
,COUNT(OI.Picked) AS PickCount
,COUNT(OI.[Identity]) AS NeededCount
,shortDesc
,OL.PickLocation
,OL.PickZone
FROM OrderLine OL
INNER JOIN Products P ON ol.ProductID = p.ProductID
INNER JOIN OrderItem OI ON OL.[Identity] = OI.OrderLineIdentity
INNER JOIN Boxes b ON OI.BoxID = b.BoxID
INNER JOIN PickingLog pl ON b.BoxID = pl.BoxID
WHERE B.BoxBarcode = @BoxBarcode
GROUP BY b.BoxID
,p.productCode
,ol.ProductID
,shortDesc
,OL.PickLocation
,PL.PickingEnd
,OL.PickZone
ORDER BY OL.PickZone
一些样本结果
粗体数字表示拾取的项目和需要的项目。它们应该是1,当前为2,当前为4
5168 A264 27018 **2 2** Colour: Black A04D021 A
5168 A946-41.5 27523 **2 2** Size 41.5. UK Size 7/8. US Size: M8/W10 A02C049 A
5168 A978 27594 **2 2** Size: One Size A03C022 A
5168 E915 33157 0 **4** Red. 100% cotton. Size: 30 x 20". B03E024 B
5168 A026-M 26919 0 **2** Waist size: M (34" - 36") D03E019 D
下面是解决此类问题的方法。选择一个给出重复项的行,比如说BoxId=5,然后运行一条语句,不进行分组和计数,只查看该ID
SELECT b.BoxID as BoxID, p.productCode as ProductCode, ol.ProductID
, OI.Picked, OI.[Identity], shortDesc, OL.PickLocation, OL.PickZone
from OrderLine OL
join Products P on ol.ProductID = p.ProductID
join OrderItem OI on OL.[Identity] = OI.OrderLineIdentity
join Boxes b on OI.BoxID = b.BoxID
join PickingLog pl on b.BoxID = pl.BoxID
WHERE B.BoxBarcode = @BoxBarcode AND B.Boxid=5
然后看看它返回了多少行。有时,您会在这里看到重复项,因为您在这里有多个不同的记录,而您认为没有不同的记录。然后您可以相应地调整代码或期望。其他时候,您将看到重复的相同记录。在这种情况下,请将每个联接表中的主键添加到选定列中。很可能,其中一个表有两个要连接的条目。例如,pickinglog可能有多个条目,但您只需要具有特定标志current=1的条目。一旦找到问题所在,您可以为该特定联接在ON子句中添加AND current=1。您应该显示示例数据和预期结果。这可能是您的一个联接导致了问题,但如果看不到数据,我不能说。您使用的是什么数据库管理系统?MySQL和SQL Server不一样。也许。。。count Distinct OI.选择作为PickCount count Distinct OI.[identity]作为needCount,因为我相信联接对您的计数有负面影响。虽然更好的方法可能是先进行子选择以聚合计数,然后在表键上进行联接。当人们不坚持使用一种文本格式样式时,这确实会让我感到厌烦。我看到的主要问题是别名之间的差异。在我再次检查FROM关键字之前,我没有看到与OL别名的连接,为了清楚起见,该关键字应该位于另一行,并且从声明到使用,别名的大小写不会保持不变。如果您的shift键太难持续使用,请不要将任何内容大写。如果你不想在一个项目和另一个项目之间按相同的键顺序,就把它从oi缩短为o。这可能会修复您的错误,除非这只是一个错误。