从表中选择多列,但只按一列分组
从表中选择多列,但只按一列分组
表名为\"OrderDetails\",列如下:
OrderDetailID || ProductID || ProductName || OrderQuantity
我试图选择多个列并按ProductID进行分组,同时对OrderQuantity进行求和。
Select ProductID,ProductName,OrderQuantity Sum(OrderQuantity) from OrderDetails Group By ProductID
但是,当然这段代码会出错。我必须添加其他列名称才能进行分组,但这不是我想要的,因为我的数据有很多物品,所以结果是出乎意料的。
示例数据查询:
从OrderDetails中选择ProductID,ProductName和OrderQuantity
以下是结果:
ProductID ProductName OrderQuantity 1001 abc 5 1002 abc 23 (ProductNames can be same) 2002 xyz 8 3004 ytp 15 4001 aze 19 1001 abc 7 (2nd row of same ProductID)
期望的结果:
ProductID ProductName OrderQuantity 1001 abc 12 (group by productID while summing) 1002 abc 23 2002 xyz 8 3004 ytp 15 4001 aze 19
如何选择多个列并按ProductID进行分组,因为ProductName不是唯一的?
在这样做的同时,还要获得OrderQuantity列的总和。
admin 更改状态以发布 2023年5月20日
我只是想添加一种更有效和通用的解决这类问题的方法。
主要想法是使用子查询。
做你的group by并在表的ID上连接同一张表。
你的情况更具体,因为你的productId是不唯一的,所以有两种解决方法。
我将从更具体的解决方案开始:
由于你的productId是不唯一的,所以我们需要一个额外的步骤,即在分组和子查询后选择DISCTINCT
产品ID,如下所示:
WITH CTE_TEST AS (SELECT productId, SUM(OrderQuantity) Total FROM OrderDetails GROUP BY productId) SELECT DISTINCT(OrderDetails.ProductID), OrderDetails.ProductName, CTE_TEST.Total FROM OrderDetails INNER JOIN CTE_TEST ON CTE_TEST.ProductID = OrderDetails.ProductID
这样返回了期望的结果
ProductID ProductName Total 1001 abc 12 1002 abc 23 2002 xyz 8 3004 ytp 15 4001 aze 19
但是也有一种更干净的方法。我想ProductId
是指向产品表的外键,我认为在这个表中应该有一个OrderId
主键(唯一的)。
在这种情况下,只需要在一个分组上包含额外的列就需要做一些步骤。这将是以下解决方案
以这个例子中的t_Value
表为例:
如果我想按描述分组并显示所有列。
我所要做的只是:
- 创建一个
WITH CTE_Name
子查询,包含你的GroupBy列和COUNT条件 - 从value表中选择所有内容(或者你想要显示的内容),以及来自CTE的总和
INNER JOIN
CTE和ID(主键或唯一约束)列
就是这样!
这里是查询
WITH CTE_TEST AS (SELECT Description, MAX(Id) specID, COUNT(Description) quantity FROM sch_dta.t_value GROUP BY Description) SELECT sch_dta.t_Value.*, CTE_TEST.quantity FROM sch_dta.t_Value INNER JOIN CTE_TEST ON CTE_TEST.specID = sch_dta.t_Value.Id
这里是结果: