如何在INNER JOIN中对SUM的结果使用聚合SUM函数?

时间:2012-03-27 16:21:49

标签: mysql sql

这是我的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             |
-----------------------------------------------------------------------

4 个答案:

答案 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
相关问题