Как обновить таблицу с группировкой и суммой - PullRequest
1 голос
/ 24 сентября 2019

Таблица данных

|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;

Ошибка была синтаксической ошибкой в ​​«Группе» или рядом с ней

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Одним из вариантов будет объединение таблиц, содержащих агрегацию sum(amount) в подзапросе, и отображение результата в операторе обновления с помощью общего выражения таблицы:

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

Demo

0 голосов
/ 24 сентября 2019

С 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) || ',%' 

См. Демоверсию .Результаты:

> id | amount | sum_amount
> -: | -----: | ---------:
>  1 |    200 |        600
>  2 |    400 |        600
>  3 |    150 |        150
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...