mysql - SQL计数计数两次

标签 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.[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/

相关文章:

php - 优化 WordPress Woocommerce 导入脚本

php - MySQL临时表

Android,SQLITE : Failed to read row 0, CursorWindow 第 11 列,有 1 行、11 列

mysql - 4 表连接并求列的平均值

sql - 如何计算PostgreSQL中以前事件的数量和时间差?

sql-server - SQL 如何将 CASE 与 NOT EXISTS 语句一起使用

MySQL查询检查特定房间的可用性取决于两个输入日期

PHP - 如何比较两列?

c# - 在不创建 100 个表的情况下存储来自表单的数据 : ASP. NET 和 SQL Server

sql-server - MSSQL 数据库 JDBC 性能属性