Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用Group by和Sum更新表格_Sql_Postgresql_Sql Update - Fatal编程技术网

Sql 如何使用Group by和Sum更新表格

Sql 如何使用Group by和Sum更新表格,sql,postgresql,sql-update,Sql,Postgresql,Sql Update,数据表 |id | sysid | |1 | 938 | |2 | 938 | |3 | 23 | 这是我想要的更新表 |id|amount|sum_amount| |1 |200| 200+400 | |2 |400| 400+200 | |3 |150| 150 | 问题:- UPDATE update_table SET sum_amount = SUM(amount) WHERE data_table.id = upda

数据表

|id | sysid |

|1  |  938  |

|2  |  938  | 

|3  |   23  | 
这是我想要的更新表

|id|amount|sum_amount|
|1 |200| 200+400     |
|2 |400|  400+200    |
|3 |150| 150         |
问题:-

UPDATE  update_table
SET sum_amount = SUM(amount)
WHERE data_table.id = update_table.id
GROUP BY data_table.sysid;

错误是“组”处或附近的语法错误,CTE返回总和:

with cte as (
  select 
    sum(amount) sum_amount, 
    ',' || string_agg(cast(d.id as varchar), ',') || ',' ids
  from data_table d inner join update_table u
  on u.id = d.id
  group by d.sysid
)
update update_table u
set sum_amount = c.sum_amount
from cte c
where c.ids like '%,'|| cast(u.id as varchar) || ',%' 
请参阅。
结果:


使用返回总和的CTE:

with cte as (
  select 
    sum(amount) sum_amount, 
    ',' || string_agg(cast(d.id as varchar), ',') || ',' ids
  from data_table d inner join update_table u
  on u.id = d.id
  group by d.sysid
)
update update_table u
set sum_amount = c.sum_amount
from cte c
where c.ids like '%,'|| cast(u.id as varchar) || ',%' 
请参阅。
结果:


一种选择是在子查询中连接包含
总和(金额)
聚合的表,并通过公共表表达式将结果反映到update语句中:

with d as
( 
 select * from
  (
  select d.sysid, sum(u.amount)   
    from data_table d
    join update_table u on u.id = d.id
   group by d.sysid
  ) q1
  right join data_table q2
  on q1.sysid=q2.sysid
)
update update_table u
   set sum_amount = d.sum
  from d
 where u.id = d.id
returning u.*;

id  amount  sum_amount
1   200     600
2   400     600
3   150     150

一个选项是在子查询中连接包含
总和(金额)
聚合的表,并通过公共表表达式将结果反映到update语句中:

with d as
( 
 select * from
  (
  select d.sysid, sum(u.amount)   
    from data_table d
    join update_table u on u.id = d.id
   group by d.sysid
  ) q1
  right join data_table q2
  on q1.sysid=q2.sysid
)
update update_table u
   set sum_amount = d.sum
  from d
 where u.id = d.id
returning u.*;

id  amount  sum_amount
1   200     600
2   400     600
3   150     150

谢谢,我在问题中键入了一些错误,更新表不包含sysid,因此我可以使用id吗?UPDATE UPDATE_表而不是data_表UPDATE_表是另一个表吗?如果是,为什么要更新?你需要插入。是的,这是另一个不同的表。我已经计算了update_表中的金额,然后我需要根据data_表汇总金额。我更正了问题中的表。Update_表的id行与data_表的id行相同,我尝试了您的代码,但每行的编号都相同。我想因为我在错误的数据源表上误导了你,你做了什么?您完全更改了表的架构?谢谢,我在问题中键入了一些错误,update_表不包含sysid,所以我可以使用id吗?UPDATE UPDATE_表而不是data_表UPDATE_表是另一个表吗?如果是,为什么要更新?你需要插入。是的,这是另一个不同的表。我已经计算了update_表中的金额,然后我需要根据data_表汇总金额。我更正了问题中的表。Update_表的id行与data_表的id行相同,我尝试了您的代码,但每行的编号都相同。我想因为我在错误的数据源表上误导了你,你做了什么?您完全更改了表的架构?为什么要查询
更新
?这不会返回您可能分组的任何数据。它只有与
SELECT
结合使用才能真正检索数据。。然后您可以对它进行分组为什么要查询
更新
?这不会返回您可能分组的任何数据。它只有与
SELECT
结合使用才能真正检索数据。。然后你可以把它分组