1

私は定期的にこの問題に遭遇しましたが、ここに例があります....

注文テーブルと配送テーブルがあります。各注文は、1 つから複数の配送を持つことができます。

Order Table に基づいて合計を報告する必要がありますが、1 行ごとに配送も表示する必要があります。

このための SQL および関連するアクセス レポートを簡単に作成できます ....

SELECT xxx 
    FROM 
        Order 
    LEFT OUTER JOIN 
        Delivery on Delivery.OrderNO = Order.OrderNo

加算要素に到達するまで。私は明らかに、各注文を 1 回だけ合計したいと考えています。

e.g. The SQL might return the following based on 2 Orders (ignore the banalness of the report, this is very much simplified)
Region  OrderNo    Value    Delivery Date
North   1          £100     12-04-2012
North   1          £100     14-04-2012
North   2          £73      01-05-2012
North   2          £73      03-05-2012
North   2          £73      07-05-2012
South   3          £50      23-04-2012

私は報告したいと思います:

Total Sales North - £173
    Delivery 12-04-2012
    Delivery 14-04-2012
    Delivery 01-05-2012
    Delivery 03-05-2012
    Delivery 07-05-2012

Total Sales South - £50
    Delivery 23-04-2012

私が言及しているビットは、173 ポンドと 50 ポンドの計算であり、その最初のものは明らかに 419 ポンドであってはなりません!

過去に、MAX (特定の注文に対して) のようなものを使用しましたが、それはごまかしのようです。

確かに、この一見一般的な問題に対する通常の答えがあるはずですが、私はそれを見つけることができません.

コードは必ずしも必要ではありません。正しい方向に役立つポイントです。

どうもありがとう、

クリス。

4

2 に答える 2

0

ロールアップ オペレーターは見栄えがよくない場合があります。ただし、現在表示されている通常の集計が行われ、注文の小計が表示されます。これはあなたが探しているものです。

SELECT xxx 
    FROM 
        Order 
    LEFT OUTER JOIN 
        Delivery on Delivery.OrderNO = Order.OrderNo
GROUP BY xxx
WITH ROLLUP;

残りのクエリがどのように設定されているか正確にはわかりませんが、次のようになります。

Region  OrderNo    Value    Delivery Date
North   1          £100     12-04-2012
North   1          £100     14-04-2012
North   2          £73      01-05-2012
North   2          £73      03-05-2012
North   2          £73      07-05-2012
NULL    NULL       f419     NULL
于 2012-05-04T14:17:20.663 に答える
0

あなたが望むのは、集計操作のウィンドウ関数と呼ばれるものだと思います。次のようになります。

SELECT xxx, SUM(Value) OVER (PARTITION BY Order.Region) as OrderTotal
FROM 
    Order 
LEFT OUTER JOIN 
    Delivery on Delivery.OrderNO = Order.OrderNo

MSDNの記事はこちら。は、が個別の ごとに個別に実行されるようにPARTITION BY指示します。SUMOrder.Region

編集:注文が複数回カウントされることについてあなたが言ったことを見逃していたことに気付きました. あなたができることの1つはSUM()、CTEとして参加する前の値です(スキーマを少し推測してください):

WITH RegionOrders AS (
    SELECT Region, OrderNo, SUM(Value) OVER (PARTITION BY Region) AS RegionTotal
    FROM Order
)
SELECT Region, OrderNo, Value, DeliveryDate, RegionTotal
FROM RegionOrders RO
INNER JOIN Delivery D on D.OrderNo = RO.OrderNo
于 2012-05-04T14:05:10.180 に答える