2013-04-16 20 views
9

私は注文書から注文を取得しようとしています。私の見解では、正確に同じ値を持ついくつかの行がありますが、これらの値をorderidにグループ化し、その順序の量の合計を取っていきたいと思います。SQL Server - 1つの列のGROUP BY

のような私の見解結果が何か

:ような何かを取得するには

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

私のような何かをしたい

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の特定の列でグループ化する可能性がありますか?他の列を仮定

+0

は、私は申し訳ありませんが、私の例に何か問題があった、私はそれをedittedましWHERE CTE FROM 量 、それはあまりにも私のロジックであったことを今 – Jovano

答えて

14

あなたは次群から目的の行を取り出すためにSUM(Quantity)OVER(PARTITION BY Order_id) + ROW_NUMBERCTEを使用することができます。

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 
+0

ARTICLE_IDのように見えますが、各ORDER_IDに複数のことができます。上記のCTEサンプルでは、​​最初に選択されたものが完全な結果ではありません。 – harsh

+0

@harsh:OPは彼が記事でグループを望んでいると言わなかったので、私はそれをそのまま残しました。さもなければ、彼は単にARTICLE_IDを 'PARTITION BY'に追加することができます。 –

+0

まず第一に:ティムは正しいです。記事の種類が1つだけなので、Article_idでグループ化する必要はありません。第二に、MySQLを使っていたかのように、ちょうど1つのグループを使うことができたように、ひどく複雑な回避策ですが、今はうまくいきます!あなたにすべてのクレジット、ありがとう! – Jovano

10

最も単純な答えは

のいずれかである、グループ化カラムに機能的に依存しています。同様に他の列によってグループ。

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 

それは単にグループ化されているとは対照的に、実際に、グループ化のために必要とされる項目を示す最初のより明確だと思うように私の個人的な好みは、第二のアプローチでありますグループ化されていない/集約されていない列の問題を回避する。

+0

明確にする必要がありますが、ときに私新しいビューを作成しようとすると、いくつかの新しい問題が発生します。最初の解決策では、次のようになります。「IS NULLまたはLIKE演算子を使用する場合を除いて、text、ntext、およびimageデータ型を比較またはソートすることはできません。私の例には含まれていないいくつかの列によって引き起こされます。 – Jovano

+0

@ JorikvanOnna:varcharカラムは常にmax、しかし必ずしもtext、ntextまたはimageデータ型をサポートすると期待します。これは問題の根本的な原因と思われるので、質問を更新してこの情報を含めることをおすすめします。この制限があってもティムの答えはうまくいくはずです。もう1つのアプローチは、グループ化列でグループ化し、集計値をインラインビュー/ CTEに含め、次に問題の列を含む他の表に結合することです。 –

0

さまざまなArticle_idを持つ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

私の期待した結果は本当に間違っていたが、私はそれを編集した – Jovano

0

私はあなたと同じ種類のテーブルを使用しています。それをすばやくテストするために名前が異なることになります。 次のクエリを参照してください。必要に応じて名前を変更します。 CTE AS(ORDER_ID SELECT、 CUSTOMER_ID、 のarticle_id、 DELIVERY_DATE、 量=合計(数量) OVER(ORDER_ID BY パーティション)、 RN = ROW_NUMBER() OVER( WITH

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

パーティションBY order_id ORDER BY delivery_date ASC) FROM orders) SELECT order_id、 customer_id、 article_id、 DELIVERY_DATE、RN = 1