我定期点击这个问题,但这是一个例子......
我有订单和交货表。每个订单可以有一到多个交货。
我需要根据订单表报告总数,但也要逐行显示交货。
我可以轻松地为此编写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这样的东西(对于给定的订单),但这似乎是一种软糖。
当然,对这个看似常见的问题必须有一个定期的答案,但我找不到。
我不一定需要代码 - 只是朝着正确方向发挥作用。
非常感谢,
克里斯。
答案 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