按ITEM编号分组,并求库存数量之和

3
我正在努力思考如何按照物品编号进行分组,并将数量添加到库存中。
我目前的代码是:
SELECT dbo.InventoryItems.ItemNo, dbo.InventoryItems.DescriptionMed AS Description
     , SUM(dbo.InventoryItems.QtyToStock) AS QtytoStock, dbo.Locations.LocationCode
  FROM dbo.InventoryItems INNER JOIN dbo.Locations
    ON dbo.InventoryItems.LocationID = dbo.Locations.LocationID
 GROUP BY dbo.InventoryItems.ItemNo, dbo.InventoryItems.QtyToStock
     , dbo.InventoryItems.DescriptionMed, dbo.Locations.LocationCode
HAVING (dbo.InventoryItems.ItemNo LIKE 'CL10%')

我得到了以下结果:

enter image description here

但我期望的输出是:

CL1000将只出现在两行中,它们的总和。 请帮忙!

ItemNo          Description               QTYtoStock      LocationCode
CL1000          Square Seat Legs             4               CREST
CL1000          Square Seat Legs             93              DZ
CL1002          Square Low Back Sofa         5               DZ

我注意到CL1000有两个不同的描述,而你正在对此进行分组 - 我认为这可能会成为一个问题。 - user3496218
1个回答

6
你需要正确使用 GROUP BY
SELECT ii.ItemNo, ii.DescriptionMed AS Description, 
       SUM(ii.QtyToStock) AS QtytoStock, l.LocationCode
FROM dbo.InventoryItems ii INNER JOIN
     dbo.Locations l
     ON ii.LocationID = l.LocationID
WHERE ii.ItemNo LIKE 'CL10%'
GROUP BY ii.ItemNo, ii.DescriptionMed, l.LocationCode;  

所有未聚合的列(或表达式)都应该在 GROUP BY 中。 QtyToStock 正被聚合,所以不适合。

进一步建议:

  • 使用表别名。 这些应该是表的缩写,使它们易于跟踪。
  • 使用缩短的别名限定列名。 更容易编写和阅读。
  • HAVING 子句在 GROUP BY 键上。 这通常可以使用 WHERE 更好地处理。 WHERE 将减少需要聚合的行数,这通常会提高性能。

嗨,Gordon,最后一个问题,如果一个物品有两个不同的位置,但我仍然想获取其数量的总和,无论它在不同的位置上,该怎么办? - user9399808
@TrishFernandez . . . 从 SELECTGROUP BY 中删除 locationCode - Gordon Linoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接