Показать сумму всего за каждую запись - PullRequest
2 голосов
/ 22 декабря 2009

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

  • ItemName
  • Цена

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

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

SELECT ItemName, 
       SUM(Price)
  FROM Items

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

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

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

Ответы [ 9 ]

6 голосов
/ 22 декабря 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
3 голосов
/ 22 декабря 2009

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

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

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

2 голосов
/ 22 декабря 2009

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

2 голосов
/ 22 декабря 2009

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

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

SELECT SUM(Price) FROM Items
0 голосов
/ 23 декабря 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
0 голосов
/ 22 декабря 2009

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

SELECT SUM(Price) FROM Items
0 голосов
/ 22 декабря 2009

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

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

Если вы хотите получить сумму ВСЕХ предметов, что означает сообщение ItemName?

таблица:

item   price
spoon  2
spoon  4
fork   3
plate  6

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

0 голосов
/ 22 декабря 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
0 голосов
/ 22 декабря 2009

Вы пробовали

 SELECT SUM(Price) FROM Items
...