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

Mysql 使用SUM()而不对结果进行分组,mysql,sum,Mysql,Sum,我已经读过了,但是想不出一种方法来解决我的具体问题。我知道SUM是一个聚合函数,不这样使用它是没有意义的,但是在这个特定的例子中,我必须在维护每一行的同时对所有结果进行求和 这是桌子: --ID-- --amount-- 1 23 2 11 3 8 4 7 我需要对金额求和,但保留每个记录,因此输出应如下所示: --ID-- --amount-- 1 49 2 49 3

我已经读过了,但是想不出一种方法来解决我的具体问题。我知道SUM是一个聚合函数,不这样使用它是没有意义的,但是在这个特定的例子中,我必须在维护每一行的同时对所有结果进行求和

这是桌子:

--ID-- --amount--
  1        23
  2        11
  3        8
  4        7
我需要对金额求和,但保留每个记录,因此输出应如下所示:

--ID-- --amount--
  1        49
  2        49
  3        49
  4        49
我有这个查询,但它只对每一行进行求和,而不是将所有结果相加:

SELECT 
    a.id,
    SUM(b.amount)

FROM table1 as a 
JOIN table1 as b ON a.id = b.id
GROUP BY id
如果没有总和,它将只返回一行,但我需要维护所有ID


注意:是的,这是一个非常基本的示例,我可以在这里使用php来实现这一点,但很明显,表更大,有更多的行和列,但这不是重点。

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

SELECT * FROM table1, (SELECT SUM(amount) FROM table1 AS amount) t
您需要将表中每一行的总和的值计算到每个id。由于subselect 49只有一个结果,因此它基本上只会附加到每个id上。

这只执行一个总和查询,因此它应该执行OK:

SELECT a.id, b.amount
FROM table1 a
cross join (SELECT SUM(amount) as amount FROM table1 AS amount) b
使用MS SQL,您可以在

当你想做每月总结,或者做季度销售报告或年度报告时,分区是非常有用的。。。 注意,它对所有行都执行不同的操作

 select distinct id, SUM(amount) OVER(PARTITION BY id) as [SUM_forPARTITION]
 from (
     select 1 as id, 23 as amount
     union all
     select 1 as id, 23 as amount
     union all
     select 2 as id, 11 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
) OverPARTITIONID

如果其他人也有同样的问题,但没有加入,我们可以采取以下措施

select *
,totcalaccepted=(select sum(s.acceptedamount)  from cteresult s)
, totalpay=(select sum(s.payvalue)  from cteresult s)     
from cteresult  t
end

@波希米亚人,仔细看,子查询不在SELECT子句中,但实际上是FROM子句的一部分,FROM子句创建笛卡尔乘积。它只执行一次。我一定是错了,但是你认真地写出了数据库中的每一个值吗?这不是很有程序性,因此也不是很有帮助。这是一个示例,您可以从。。。有了复杂的查询。。第二个例子是分区,当你想每月求和时,分区是非常有用的。例如,Take a vote!我第一次看到明显正确的答案时,答案不是:Edit:Missed mysql tag,但刚刚选中,这段代码适用于mysql 8.0yes Stefan如果在分区ID上添加适当的索引,这将是致命的,我非常喜欢这种方法,而不是交叉和内部连接。我喜欢重复的答案与被接受的答案相同——几乎和我喜欢从中复制的答案一样!相同的查询,只是格式不整齐。我遇到一个错误:[HY000][1137]无法重新打开表:“a”如果我有多个类别,如a.id、a.name、a.location,该怎么办?它还会基于a.id求和吗??
--- OVER PARTITION ID
 select distinct id, SUM(amount) OVER(PARTITION BY id) as [SUM_forPARTITION]
 from (
     select 1 as id, 23 as amount
     union all
     select 1 as id, 23 as amount
     union all
     select 2 as id, 11 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
) OverPARTITIONID
select *
,totcalaccepted=(select sum(s.acceptedamount)  from cteresult s)
, totalpay=(select sum(s.payvalue)  from cteresult s)     
from cteresult  t
end