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, SUM(Value) OVER (PARTITION BY Order.Region) as OrderTotal
FROM 
    Order 
LEFT OUTER JOIN 
    Delivery on Delivery.OrderNO = Order.OrderNo

这是 MSDN 文章。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
于 2012-05-04T14:05:10.180 回答
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 回答