注文ビューから注文を取得しようとしています。私の見解では、まったく同じ値を持つ行がいくつかありますが、これらの値を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の特定の列ごとにグループ化する別の可能性または回避策はありますか?
CTE
と 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
他の列が機能的にグループ化列に依存していると仮定すると、最も簡単な答えは次のいずれかです。
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番目のアプローチです。グループ化されていない/集計されていない列の問題を回避するために単にグループ化されているのではなく、実際にグループ化に必要なアイテムを示すことは最初のアプローチよりも明確だと思います。
あなたのシナリオでは、さまざまな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
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
私はあなたのものと同様の種類のテーブルを使用しました。それを高速にテストするために、名前は異なるjsuになります。次のクエリを参照してください。必要に応じて名前を変更します。
select ordid,customerid,articleid,SUM(cast(quantity as numeric)) quantity from test_stack group by ordid,customerid,articleid