Mysql SQL计数计数两次

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

我在SQL语句方面遇到了问题,对SQL没有太多的经验,已经走到了死胡同。我正在尝试返回已拾取的项目数和要拾取的项目数。该语句的工作原理是它返回一个计数,但计数是它应该的两倍,即1作为2等。有人能指出我遗漏了什么吗

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。这可能会修复您的错误,除非这只是一个错误。