web-dev-qa-db-ja.com

SQL Server-1列の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

私は次のようなことをしたい:

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

ただし、1つの列でグループ化することはできません。そうしないと、メッセージが表示されます。

[...]は、集計関数またはGROUP BY句のいずれにも含まれていないため、選択リストでは無効です。

SQL Serverの特定の列ごとにグループ化する別の可能性または回避策はありますか?

14
Jovano

CTESUM(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 

[〜#〜] 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
18
Tim Schmelter

他の列が機能的にグループ化列に依存していると仮定すると、最も簡単な答えは次のいずれかです。

a。他の列でもグループ化します。

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

または

b。 maxなどの集約関数を使用します。

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

私の個人的な好みは2番目のアプローチです。グループ化されていない/集計されていない列の問題を回避するために単にグループ化されているのではなく、実際にグループ化に必要なアイテムを示すことは最初のアプローチよりも明確だと思います。

9
user359040

あなたのシナリオでは、さまざまなArticle_idを持つGroup-by Order_idが正しいとは思えません。期待した結果が間違っているようです。そのはず:

PR10.001には、2つの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
0
harsh

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 、配達日、数量FROM cte WHERE rn = 1

0
Nani

私はあなたのものと同様の種類のテーブルを使用しました。それを高速にテストするために、名前は異なるjsuになります。次のクエリを参照してください。必要に応じて名前を変更します。

select ordid,customerid,articleid,SUM(cast(quantity as numeric)) quantity from test_stack group by ordid,customerid,articleid
0
Amit Sharma