使用SUM()而不对结果进行分组

Ano*_*ous 18 mysql sum

我已经读过(这个),但是无法找到一种方法来实现它来解决我的具体问题.我知道SUM()是一个聚合函数,没有理由不使用它,但在这个特定的情况下,我必须SUM()保持每一行的所有结果.

这是表格:

--ID-- --amount--
  1        23
  2        11
  3        8
  4        7
Run Code Online (Sandbox Code Playgroud)

我需要SUM()金额,但保留每条记录,所以输出应该像:

--ID-- --amount--
  1        49
  2        49
  3        49
  4        49
Run Code Online (Sandbox Code Playgroud)

我有这个查询,但它只汇总每一行,而不是所有结果:

SELECT 
    a.id,
    SUM(b.amount)

FROM table1 as a 
JOIN table1 as b ON a.id = b.id
GROUP BY id
Run Code Online (Sandbox Code Playgroud)

没有SUM()它只会返回一行,但我需要维护所有ID ...

注意:是的,这是一个非常基本的例子,我可以使用php在这里执行此操作,但显然表格更大,行和列更多,但这不是重点.

Zan*_*ien 14

SELECT a.id, b.amount
FROM table1 a
CROSS JOIN
(
    SELECT SUM(amount) amount FROM table1
) b
Run Code Online (Sandbox Code Playgroud)

您需要执行表格中每行总和的值的笛卡尔连接id.因为subselect(49)只有一个结果,所以它基本上只是被添加到每个结果上id.


Val*_*kov 10

使用MS SQL,您可以使用OVER()

 select id, SUM(amount) OVER()
 from table1;

select id, SUM(amount) OVER()
from (
  select 1 as id, 23 as amount
  union all
  select 2 as id, 11 as amount
  union all
  select 3 as id, 8 as amount
  union all
  select 4 as id, 7 as amount
) A
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

--- OVER PARTITION ID
PARTITION当你想要每个MONTH做SUM()或者做季度报告销售或每年......时非常有用(注意需要明确它对所有行都做)

--- OVER PARTITION ID
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 这是示例,您可以将“FROM (...) 替换为您的复杂查询.. 第二个示例是使用 PARTITION BY,这在您想要按月执行 SUM() 时非常有用,例如 (2认同)

Jon*_*Jon 6

使用子查询将原始表连接到总和:

SELECT * FROM table1, (SELECT SUM(amount) FROM table1 AS amount) t
Run Code Online (Sandbox Code Playgroud)