首页 文章

从表中选择多个列,但逐个分组

提问于
浏览
24

表名是“OrderDetails”,列如下:

OrderDetailID || ProductID || ProductName || OrderQuantity

我正在尝试选择多个列和Group By ProductID,同时具有OrderQuantity的SUM .

Select ProductID,ProductName,OrderQuantity Sum(OrderQuantity)
 from OrderDetails Group By ProductID

但是这个代码当然会出错 . 我必须添加其他列名称分组,但这不是我想要的,因为我的数据有很多项目所以 results are unexpected that way.

示例数据查询:

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

如何选择多列和Group By ProductID列,因为ProductName不是唯一的?

在这样做的同时,也获得OrderQuantity列的总和 .

8 回答

  • 0

    SELECT ProductID, ProductName, OrderQuantity, SUM(OrderQuantity) FROM OrderDetails WHERE(OrderQuantity) IN(SELECT SUM(OrderQuantity) FROM OrderDetails GROUP BY OrderDetails) GROUP BY ProductID, ProductName, OrderQuantity;

    我使用上面的解决方案来解决Oracle12c中的类似问题 .

  • 32

    == ==编辑

    我再次检查了你的问题并得出结论,这是无法做到的 .

    ProductName不是唯一的,它必须是 Group By 的一部分或从结果中排除 .

    例如,如果只有 Group By ProductID,SQL会如何向您显示这些结果?

    ProductID | ProductName | OrderQuantity 
    ---------------------------------------
    1234      | abc         | 1
    1234      | def         | 1
    1234      | ghi         | 1
    1234      | jkl         | 1
    
  • 4
    WITH CTE_SUM AS (
          SELECT ProductID, Sum(OrderQuantity) AS TotalOrderQuantity 
          FROM OrderDetails GROUP BY ProductID
        )
        SELECT DISTINCT OrderDetails.ProductID, OrderDetails.ProductName, OrderDetails.OrderQuantity,CTE_SUM.TotalOrderQuantity 
        FROM 
        OrderDetails INNER JOIN CTE_SUM 
        ON OrderDetails.ProductID = CTE_SUM.ProductID
    

    请检查一下是否有效 .

  • 0

    您可以尝试以下查询 . 我假设你有一张表用于所有数据 .

    SELECT OD.ProductID, OD.ProductName, CalQ.OrderQuantity
    FROM (SELECT DISTINCT ProductID, ProductName
          FROM OrderDetails) OD
    INNER JOIN (SELECT ProductID, OrderQuantity SUM(OrderQuantity)
                FROM OrderDetails
                GROUP BY ProductID) CalQ
    ON CalQ.ProductID = OD.ProductID
    
  • -3

    mysql GROUP_CONCAT 功能可以帮助https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html#function_group-concat

    SELECT ProductID, GROUP_CONCAT(DISTINCT ProductName) as Names, SUM(OrderQuantity)
    FROM OrderDetails GROUP BY ProductID
    

    这将返回:

    ProductID     Names          OrderQuantity
    1001          red            5
    1002          red,black      6
    1003          orange         8
    1004          black,orange   15
    

    与@Urs Marian一样的想法在这里发布https://stackoverflow.com/a/38779277/906265

  • 9

    当我有多列选择时,我使用此技巧分组一列:

    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
    

    这有效 .

  • 2

    Your Data

    DECLARE @OrderDetails TABLE 
    (ProductID INT,ProductName VARCHAR(10), OrderQuantity INT)
    
    INSERT INTO @OrderDetails VALUES
    (1001,'abc',5),(1002,'abc',23),(2002,'xyz',8),(1002,'abc',1),
    (3004,'ytp',15),(4001,'aze',19),(1001,'abc',7),(1001,'abc',2)
    

    Query

    Select ProductID,ProductName, Sum(OrderQuantity) Total
     from @OrderDetails 
     Group By ProductID ,ProductName
    

    Result

    ╔═══════════╦═════════════╦═══════╗
    ║ ProductID ║ ProductName ║ Total ║
    ╠═══════════╬═════════════╬═══════╣
    ║      1001 ║ abc         ║    14 ║
    ║      1002 ║ abc         ║    24 ║
    ║      4001 ║ aze         ║    19 ║
    ║      2002 ║ xyz         ║     8 ║
    ║      3004 ║ ytp         ║    15 ║
    ╚═══════════╩═════════════╩═══════╝
    
  • 2

    你可以试试这个:

    Select ProductID,ProductName,Sum(OrderQuantity) 
     from OrderDetails Group By ProductID, ProductName
    

    您只需要在 Select 子句中没有聚合函数的 Group By 列 . 因此,在这种情况下,您可以使用 Group By ProductID和ProductName .

相关问题