我有这张表:
ID | 区域 | 姓名 | 价值 |
---|---|---|---|
1 | 一个 | 美国广播公司 | 1.2 |
2 | 乙 | 美国广播公司 | 2.3 |
3 | 碳 | 定义 | 3.4 |
我可以计算SUM
每个values
的name
:
SELECT
name,
SUM(value) AS "total"
FROM table
GROUP BY name;
它将输出:
姓名 | 全部的 |
---|---|
美国广播公司 | 3.5 |
定义 | 3.4 |
现在我想将这些值作为计算列添加到表中,我的预期输出是:
ID | 区域 | 姓名 | 价值 | 全部的 |
---|---|---|---|---|
1 | 一个 | 美国广播公司 | 1.2 | 3.5 |
2 | 乙 | 美国广播公司 | 2.3 | 3.5 |
3 | 碳 | 定义 | 3.4 | 3.4 |
我的尝试是将该条款添加SELECT
为列:
SELECT
table.*,
(SELECT
SUM(value) AS "total"
FROM table
GROUP BY name)
FROM table
但失败了:
子查询返回多于 1 行
我理解为什么:SELECT
将输出所有名称,而不仅仅是当前记录的名称。所以我添加了一个WHERE
子句,强制仅选择当前名称:
SELECT
id,
area,
name AS current_name,
value,
(SELECT
SUM(value)
FROM table
WHERE name=current_name
GROUP BY name) AS "total"
FROM table
成功了!缺点是该name
列现在被称为current_name
。
有没有办法避免使用别名而保留实际的列名?
您正在寻找窗口函数
SUM OVER
。子查询解决方案如下:
尝试这样的事情: