假设您有一些包含这两列的项目表:
- 项目名
- 价格
....哪里ItemName
是独一无二的。
你如何显示所有价格的总和ItemName
(我正在使用 Oracle)?如果我只是试试这个:
SELECT ItemName,
SUM(Price)
FROM Items
我收到此错误:
ORA-00937: 不是单组组函数
...只有当我使用 GROUP BY 时才会消失。但是我只能按组求和,而不是全部。
SELECT ItemName, SUM(Price) OVER()
FROM Items
此查询将为您返回 's 列表ItemName
以及每个 's 的价格总和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
您不能在同一查询中既分组又不分组。您可以使用子查询来获取价格:
select ItemName, (select sum(Price) from Items) as AllPrices
from Items
由于子查询不使用主查询中记录的任何数据,因此数据库应该能够对其进行优化以仅执行一次子查询。
如果您想要所有这些的总和,为什么要在查询中包含 ItemName ?您有两个选择,包括 ItemName 并使用“GROUP BY ItemName”获取该 ItemName 的所有价格的总和,或者您可以获取所有项目的总和,在这种情况下,您从选择中删除“ItemName”。
如果 ItemName 是唯一的,那么每个 ItemName 的 Price 是否都与该 ItemName 相关联?
如果您要查找所有商品价格的总和,则必须从 SQL 中省略 ItemName:
SELECT SUM(Price) FROM Items
也许您想要的是一份物品清单、它们的价格以及总价格?
SELECT ItemName, SUM(Price) Price
FROM Items
GROUP BY ROLLUP(ItemName);
ITEMNAME PRICE
======== =====
Apples 1.00
Bananas 2.00
Cherries 3.00
6.00
你有没有尝试过
SELECT SUM(Price) FROM Items
如果 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
它希望你这样做:
select ItemName, sum(price)
from table
group by ItemName;
如果您想要所有项目的总和,那么报告 ItemName 是什么意思?
桌子:
item price
spoon 2
spoon 4
fork 3
plate 6
对于上表,总和是 15。总和的项目名称是什么?
由于 ItemName 是唯一的,因此您需要使用以下...
SELECT SUM(Price) FROM Items