Как использовать агрегатную функцию SUM по результату SUM в INNER JOIN? - PullRequest
2 голосов
/ 27 марта 2012

Это мой 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-ко-многим.У каждого товара есть столбец частичное количество, и я добавляю эти частичные суммы, чтобы получить общую сумму за каждый заказ.

Я хотел бы получить общую сумму для всех заказов, как это сделать?

Так что я хотел бы что-то вроде: 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 ]

1 голос
/ 27 марта 2012

Я бы настоятельно рекомендовал делать подобные вещи в приложении, а не в 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

Я не могу проверить выполнениепланируйте сравнить это с опцией Subselect, опубликованной в другом ответе Lamak, но SQL Server определенно оптимизирует перекрестное применение намного лучше, чем subselect.

1 голос
/ 27 марта 2012

Это будет удар по производительности (и предполагается, что каждая строка из 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` 
1 голос
/ 27 марта 2012

Если все, что вам нужно, это общая строка, вы можете сделать что-то вроде этого кода.Есть и другие подходы, в зависимости от того, как, если вам нужно отфильтровать выбранные заказы

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
0 голосов
/ 27 марта 2012

Если вы хотите получить итоговое значение в каждой строке, вы можете использовать функцию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...