我在使用 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
一些示例结果
粗体数字是挑选的元素和需要的元素。当前为 2 时应为 1,当前为 4 时应为 2。
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)。一旦找出问题所在,您可以将 AND current=1 添加到该特定连接的 ON 子句中。
关于mysql - SQL计数计数两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32765532/