SQL Server - GROUP BY on one column

后端 未结 5 1950
感情败类
感情败类 2020-12-31 04:48

I\'m trying to get orders from an orderview. In my view I do have some rows with exactly the same values, but I want to group these values on orderid and take the sum of the

相关标签:
5条回答
  • 2020-12-31 05:30

    In your scenario it doesn't seem correct to group-by Order_id having varying Article_id. You expected result seems wrong. It should be:

    PR10.001 has two Article_id 20.001a, 41.022b and total quantity 4 (not 3)

    Is your expectation is to get total quantity for each Order_id but retaining varying column too then you need to decide on expected result? something like:

     Order_id   Customer_id   Article_id            Delivery_date   Quantity
     ---------------------------------------------------------------------------
     PR10.001   11            20.001a, 41.022b      17-04-2013      4
     PR13.001   15            41.022b               19-04-2013      2
    
    0 讨论(0)
  • 2020-12-31 05:36

    You could use a CTE with SUM(Quantity)OVER(PARTITION BY Order_id) + ROW_NUMBER to pick out the desired row from the order-group:

    WITH cte 
         AS (SELECT order_id, 
                    customer_id, 
                    article_id, 
                    delivery_date, 
                    quantity=Sum(quantity) 
                               OVER( 
                                 partition BY order_id), 
                    rn = Row_number() 
                           OVER( 
                             partition BY order_id 
                             ORDER BY delivery_date ASC) 
             FROM   orders) 
    SELECT order_id, 
           customer_id, 
           article_id, 
           delivery_date, 
           quantity 
    FROM   cte 
    WHERE  rn = 1 
    

    DEMO

    However, your desired result seems to be incorrect (question edited)

    This is my result:

    ORDER_ID    CUSTOMER_ID ARTICLE_ID  DELIVERY_DATE   QUANTITY
    PR10.001    11          20.001a         17-04-2013  3
    PR13.001    15          41.022b         19-04-2013  2
    
    0 讨论(0)
  • 2020-12-31 05:38
    WITH cte 
         AS (SELECT order_id, 
                    customer_id, 
                    article_id, 
                    delivery_date, 
                    quantity=Sum(quantity) 
                               OVER( 
                                 partition BY order_id), 
                    rn = Row_number() 
                           OVER( 
                             partition BY order_id 
                             ORDER BY delivery_date ASC) 
             FROM   orders) 
    SELECT order_id, 
           customer_id, 
           article_id, 
           delivery_date, 
           quantity 
    FROM   cte 
    WHERE  rn = 1 
    
    0 讨论(0)
  • 2020-12-31 05:39

    I have used similar kind of table as yours. names would be different jsu to test it fast. Please refer to the following query. Modify names as you require.

    select ordid,customerid,articleid,SUM(cast(quantity as numeric)) quantity from test_stack group by ordid,customerid,articleid
    
    0 讨论(0)
  • 2020-12-31 05:44

    Assuming the other columns are functionally dependent on the grouping column, the simplest answers are either

    a. Group by the other columns as well:

    SELECT Order_id, Customer_id, Article_id, Delivery_date, sum(Quantity)
    FROM Orders
    GROUP BY Order_id, Customer_id, Article_id, Delivery_date
    

    or

    b. Use an aggregate function such as max:

    SELECT Order_id, max(Customer_id), max(Article_id), max(Delivery_date), sum(Quantity)
    FROM Orders
    GROUP BY Order_id
    

    My personal preference is the second approach, as I think it is clearer than the first in indicating which items are actually required for grouping, as opposed to which are merely being grouped to get round the ungrouped/unaggregated column problem.

    0 讨论(0)
提交回复
热议问题