这是我的SQL查询,它连接两个表:
SELECT `o`.`orderID`,
SUM(i.partialAmount) AS `amount`
FROM `OrderTable` AS `o`
INNER JOIN `Item` AS `i`
ON i.orderID = o.orderID
GROUP BY `o`.`orderID`
项目通过1对多关系连接到订单。每个项目都有一个partialAmount列,我将这些部分金额相加,以获得每个订单的总金额。
我想获得所有订单的总金额,怎么做?
所以我想要像:SUM(金额)AS totalAmount
,但这不起作用:
SELECT `o`.`orderID`,
SUM(i.partialAmount) AS `amount`,
SUM(amount) AS `totalAmount`
FROM `OrderTable` AS `o`
INNER JOIN `Item` AS `i`
ON i.orderID = o.orderID
GROUP BY `o`.`orderID`
我不想使用WITH ROLLUP - 因为我不想要额外的行。
预期产出:
-----------------------------------------------------------------------
| orderID | amount | totalAmount |
-----------------------------------------------------------------------
| 1 | 2 | 5 |
-----------------------------------------------------------------------
| 2 | 3 | 5 |
-----------------------------------------------------------------------
答案 0 :(得分:1)
如果您想要的只是一个总行,您可以执行类似此代码的操作。还有其他方法,具体取决于您是否需要过滤所选订单
SELECT `o`.`orderID`,
SUM(i.partialAmount) AS `amount`
FROM `OrderTable` AS `o`
INNER JOIN `Item` AS `i`
ON i.orderID = o.orderID
GROUP BY `o`.`orderID`
UNION
SELECT 999999,sum(i.partialAmount) as 'Amount'
FROM Item i
答案 1 :(得分:1)
这会影响性能(并假设Item
的每一行都有订单):
SELECT `o`.`orderID`,
SUM(i.partialAmount) AS `amount`,
(SELECT SUM(partialAmount) FROM `Item`) TotalAmount
FROM `OrderTable` AS `o`
INNER JOIN `Item` AS `i`
ON i.orderID = o.orderID
GROUP BY `o`.`orderID`
答案 2 :(得分:1)
我强烈建议在应用程序中执行此类操作而不是SQL,因为它是工作的重现,但它可以实现如下:
SELECT OrderTable.OrderID,
SUM(PartialAmount) AS Amount,
TotalAmount
FROM OrderTable,
Item,
(SELECT SUM(PartialAmount) AS TotalAmount FROM Item) AS total
WHERE Item.OrderID = Ordertable.OrderID
GROUP BY OrderTable.OrderID, TotalAmount
我无法检查执行计划,将其与Lamak在另一个答案中发布的Subselect选项进行比较,但SQL Server肯定会优化交叉应用,而不是subselect。
答案 3 :(得分:0)
如果你想要每一行的总值,你可以使用sum()而不是函数,这将给你两个总数 http://msdn.microsoft.com/en-us/library/ms189461.aspx
用于运行总计
sum(amount) over ()
部分总计
sum(amount) over (partition by o.orderid)
看起来像这样
SELECT distinct `o`.`orderID`,
SUM(i.partialAmount) over (partition by orderid) AS `amount`,
SUM(i.partialAmount) over () AS `totalAmount`
FROM `OrderTable` AS `o`
INNER JOIN `Item` AS `i`
ON i.orderID = o.orderID