我得到了以下表格。(只是一个样本)
THEAD
id date
------------------
2399 01/01/2017
2400 18/07/2017
2300 11/11/2016
...
tstocks
id product_id type stockq result
--------------------------------------------
2399 0000001 1 5
2399 0000001 2 10
2399 0000002 1 15
2399 0000002 2 2
2400 0000001 1 4
2400 0000001 2 6
2300 0000003 1 0
2300 0000003 2 5
每个product_id都有2个值,类型1和类型2。 thead持有id和日期。
我需要更新结果,其中stockq类型为每组product_id为1,其中tproducts.id的日期为'01 / 01/2017'
所以它最终应该是这样的:
tstocks :
id product_id type stockq result
--------------------------------------------
2399 0000001 1 5 15
2399 0000001 2 10
2399 0000002 1 15 17
2399 0000002 2 2
2400 0000001 1 4
2400 0000001 2 6
2300 0000003 1 0
2300 0000003 2 5
我尝试使用以下查询,但它在子查询错误上显示了多个值。
update tstocks
set result = (select sum(stockq)
from tstocks
group by tstocks.product_id)
from tstocks
inner join thead ON tstocks.id = thead.id
where tstocks.type = '1' and thead.date = '01/01/2017'
任何想法都将不胜感激。
提前致谢。
答案 0 :(得分:1)
我会使用可更新的CTE和窗口函数:
with toupdate as (
select s.*, sum(stockq) over (partition by id, product_id) as new_result
from tstocks
)
update toupdate
set result = new_result
from toupdate join
thead
on toupdate.id = thead.id
where thead.date = '2017-01-01' and toupdate.type = 1;
请注意,我将日期更改为标准格式并删除了类型周围的单引号。这假设列的类型分别为date
/ datetime
和数字。
您也可以按照自己的推理,但使用相关的子查询:
update s
set result = (select sum(s2.stockq)
from tstocks s2
where s2.product_id = s.product_id an s2.id = s.id
)
from tstocks s inner join
thead h
on s.id = h.id
where s.stockq = 1 and h.date = '2017-01-01';