从表中选择多列,但只按一列分组

15 浏览
0 Comments

从表中选择多列,但只按一列分组

表名为\"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日
0
0 Comments

我只是想添加一种更有效和通用的解决这类问题的方法。
主要想法是使用子查询。

做你的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表为例:

enter image description here

如果我想按描述分组并显示所有列。

我所要做的只是:

  1. 创建一个WITH CTE_Name子查询,包含你的GroupBy列和COUNT条件
  2. 从value表中选择所有内容(或者你想要显示的内容),以及来自CTE的总和
  3. 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

这里是结果:

enter image description here

0
0 Comments

当我需要选择多个列时,我使用这个技巧按一个列分组:

SELECT MAX(id) AS id,
    Nume,
    MAX(intrare) AS intrare,
    MAX(iesire) AS iesire,
    MAX(intrare-iesire) AS stoc,
    MAX(data) AS data
FROM Produse
GROUP BY Nume
ORDER BY Nume

这是有效的。

0