按项目编号分组和库存数量的总和

3 sql sql-server group-by count

我试图通过项目编号将我的头部放到太空中,并将数量添加到库存中.

我目前的代码是:

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%')
Run Code Online (Sandbox Code Playgroud)

我得到以下结果:

在此输入图像描述

但我的预期输出是:

CL1000将与它们的总和成两行.请帮忙!

ItemNo          Description               QTYtoStock      LocationCode
CL1000          Square Seat Legs             4               CREST
CL1000          Square Seat Legs             93              DZ
CL1002          Square Low Back Sofa         5               DZ
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 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;  
Run Code Online (Sandbox Code Playgroud)

所有未聚合的列(或表达式)都应该在GROUP BY. QtyToStock正在汇总,所以这是不合适的.

进一步建议:

  • 使用表别名.这些应该是表格的缩写,因此很容易遵循.
  • 使用缩短的别名限定列名称.更容易编写和阅读.
  • HAVING条款是GROUP BY关键.使用时可以更好地处理(通常)WHERE.这WHERE将减少需要聚合的行数,这通常是性能获胜.