Показать сумму всех для каждой записи

Скажем, у вас есть таблица некоторых элементов с этими двумя столбцами:

  • Название предмета
  • Цена

....где ItemName уникально.

Как показать сумму всех цен для каждого ItemName (я использую Oracle)? Если я просто попробую это:

SELECT ItemName, 
       SUM(Price)
  FROM Items

Я получаю эту ошибку:

ORA-00937: не групповая функция с одной группой

... который исчезает, только если я использую GROUP BY. Но тогда я могу СУММИТЬ только по группам, а не по всем.


person ark    schedule 22.12.2009    source источник
comment
Выбор ItemName не имеет смысла, если вы суммируете все разные элементы в одну сумму.   -  person David Oneill    schedule 22.12.2009


Ответы (9)


Вы не можете одновременно группировать и не группировать в одном запросе. Вы можете использовать подзапрос, чтобы получить цену:

select ItemName, (select sum(Price) from Items) as AllPrices
from Items

Поскольку подзапрос не использует никаких данных из записей в основном запросе, база данных должна иметь возможность оптимизировать его для выполнения подзапроса только один раз.

person Guffa    schedule 22.12.2009
comment
Работает, но неэффективно: дважды запрашивает таблицу Items. - person Jeffrey Kemp; 23.12.2009
comment
@Jeffrey: Да, но двойной запрос к таблице - единственный способ получить эту информацию в результате. - person Guffa; 23.12.2009

SELECT  ItemName, SUM(Price) OVER()
FROM    Items

Этот запрос вернет вам список ItemName вместе с общей суммой цен для каждого ItemName:

SELECT  ItemName, SUM(Price) OVER()
FROM    (
        SELECT  'Apple' AS ItemName, 100 AS price
        FROM    dual
        UNION ALL
        SELECT  'Banana', 200 AS price
        FROM    dual
        UNION ALL
        SELECT  'Cocoa', 300 AS price
        FROM    dual
        ) q


ItemName  Price
--------  -----
Apple     600
Banana    600
Cocoa     600
person Quassnoi    schedule 22.12.2009

Если ItemName уникально, не будет ли Цена для каждого ItemName тем, что связано с этим ItemName?

Если вы ищете сумму всех цен на товары, вам придется исключить ItemName из вашего SQL:

SELECT SUM(Price) FROM Items
person Kaleb Brasee    schedule 22.12.2009

Если вам нужна сумма всех из них, почему вы включаете ItemName в свой запрос? У вас есть два варианта: включить ItemName и получить сумму всех цен для этого ItemName, используя «GROUP BY ItemName», или вы можете получить сумму всех товаров, и в этом случае вы удалите «ItemName» из выбора.

person Paul Tomblin    schedule 22.12.2009

Ты пытался

 SELECT SUM(Price) FROM Items
person James Keesey    schedule 22.12.2009

Если ItemName уникально, то агрегированный результат будет содержать то же количество строк, что и таблица. Функция SUM сгруппирует по столбцу, в котором существуют дубликаты, чтобы дать вам SUM для всех столбцов с этим значением:

SELECT ItemName, SUM(Price)
FROM [Table]
GROUP BY ItemName

Табличные значения:

 ItemName   Price
    ========   =====
    Foo        $1.00
    Bar        $5.00
    Bar        $5.00

Совокупный результат:

ItemName   Price
========   =====
Foo        $1.00
Bar        $10.00
person Dave Swersky    schedule 22.12.2009

Он хочет, чтобы вы сделали:

select ItemName, sum(price)
from table
group by ItemName;

Если вам нужна сумма ВСЕХ элементов, в чем смысл сообщения об ItemName?

стол:

item   price
spoon  2
spoon  4
fork   3
plate  6

Для приведенной выше таблицы сумма равна 15. Как называется элемент суммы?

person David Oneill    schedule 22.12.2009
comment
Хорошая точка зрения. Я не могу представить, зачем ему это нужно, но вы правы. - person David Oneill; 22.12.2009

Поскольку ItemName уникально, вам нужно использовать следующее...

SELECT SUM(Price) FROM Items
person pdavis    schedule 22.12.2009

Возможно, вам нужен список предметов, их цены, а также общая стоимость?

SELECT ItemName, SUM(Price) Price
FROM Items
GROUP BY ROLLUP(ItemName);

ITEMNAME  PRICE
========  =====
Apples     1.00
Bananas    2.00
Cherries   3.00
           6.00
person Jeffrey Kemp    schedule 23.12.2009