带有重复子条目的SQL SUM - 最佳实践?

时间:2012-05-04 13:57:19

标签: sql sum left-join

我定期点击这个问题,但这是一个例子......

我有订单和交货表。每个订单可以有一到多个交货。

我需要根据订单表报告总数,但也要逐行显示交货。

我可以轻松地为此编写SQL及相关的Access报告....

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这样的东西(对于给定的订单),但这似乎是一种软糖。

当然,对这个看似常见的问题必须有一个定期的答案,但我找不到。

我不一定需要代码 - 只是朝着正确方向发挥作用。

非常感谢,

克里斯。

2 个答案:

答案 0 :(得分:0)

我相信你想要的东西被称为聚合操作的窗口函数。它看起来如下:

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

Here's the MSDN article. PARTITION BY告诉SUM为每个不同的Order.Region单独完成。

编辑:我刚注意到我错过了您对多次计算订单的说法。您可以做的一件事是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

答案 1 :(得分: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
相关问题