19

我正在尝试从订单视图中获取订单。在我看来,我确实有一些具有完全相同值的行,但我想将这些值分组到 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

我想做类似的事情:

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

得到类似的东西:

 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

但我知道不可能按一列分组,否则您会收到以下消息:

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

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

4

4 回答 4

24

您可以使用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 

演示

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

这是我的结果:

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
于 2013-04-16T09:38:57.417 回答
13

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

一个。也按其他列分组:

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

或者

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

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

我个人的偏好是第二种方法,因为我认为它比第一种更清楚地表明分组实际需要哪些项目,而不是仅仅对哪些项目进行分组以解决未分组/未聚合的列问题。

于 2013-04-16T09:38:05.730 回答
0

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
于 2013-04-16T10:05:07.440 回答
0

在您的场景中,对具有不同 Article_id 的 Order_id 进行分组似乎不正确。您的预期结果似乎是错误的。它应该是:

PR10.001 有两个 Article_id 20.001a、41.022b 和总量 4(不是 3)

您是否期望获得每个 Order_id 的总数量但也保留不同的列,然后您需要决定预期结果?就像是:

 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
于 2013-04-16T09:48:45.823 回答