SQL Server - 一列上的GROUP BY

Jov*_*ano 14 sql-server group-by

我正试图从订单查看订单.在我看来,我确实有一些行具有完全相同的值,但我想在orderid上对这些值进行分组,并获取该订单数量的总和.

我的观点结果如下:

 Order_id   Customer_id   Article_id   Delivery_date   Quantity
 ---------------------------------------------------------------------------
 PR10.001   11            20.001a      17-04-2013      1
 PR10.001   11            20.001a      17-04-2013      1
 PR10.001   11            20.001a      17-04-2013      1
 PR13.001   15            41.022b      19-04-2013      1
 PR13.001   15            41.022b      19-04-2013      1
Run Code Online (Sandbox Code Playgroud)

我想做的事情如下:

SELECT Order_id, Customer_id Article_id, Delivery_date, sum(Quantity)
FROM Orders
GROUP BY Order_id
Run Code Online (Sandbox Code Playgroud)

得到类似的东西:

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

但是我知道用一个列分组是不可能的,否则你会收到消息:

[...]在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中.

是否有另一种可能性或解决方法可以按SQL Server中的一个特定列进行分组?

Tim*_*ter 18

您可以使用CTEwith SUM(Quantity)OVER(PARTITION BY Order_id)+ ROW_NUMBER从订单组中挑选所需的行:

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

DEMO

但是,您想要的结果似乎不正确(编辑问题)

这是我的结果:

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


小智 9

假设其他列在功能上依赖于分组列,则最简单的答案是

一个.按其他列分组:

SELECT Order_id, Customer_id, Article_id, Delivery_date, sum(Quantity)
FROM Orders
GROUP BY Order_id, Customer_id, Article_id, Delivery_date
Run Code Online (Sandbox Code Playgroud)

要么

湾 使用聚合函数,例如max:

SELECT Order_id, max(Customer_id), max(Article_id), max(Delivery_date), sum(Quantity)
FROM Orders
GROUP BY Order_id
Run Code Online (Sandbox Code Playgroud)

我个人的偏好是第二种方法,因为我认为它比第一种方法更清晰,表明分组实际需要哪些项目,而不是仅仅为了绕过未组合/未分组的列问题而进行分组.