具有聚合函数的update语句

时间:2013-12-29 15:16:03

标签: mysql sql sql-update

大家好日子..!: - )

我有这个表tab,其中totalUsed等于used引用的所有name值的总和

cid         name                used            total
1           a                   1               1
2           a                   3               4
3           a                   6               10
4           b                   3               3
5           b                   7               10
6           b                   10              0
7           a                   5               0

我有这段代码,但它只复制了totalUsed的相邻used

UPDATE tab
    SET totalUsed=
(
    SELECT SUM(used)
)



cid         name                used            total
1           a                   1               1
2           a                   3               3
3           a                   6               6
4           b                   3               3
5           b                   7               7
6           b                   10              10
7           a                   5               5

如果used 6的cid设置为10,则totalUsed应为20 对于cid 7,它应该是15。 如何在mysql中做到这一点?

它应该是这样的。

cid         name                used            total
1           a                   1               1
2           a                   3               4
3           a                   6               10
4           b                   3               3
5           b                   7               10
6           b                   10              20
7           a                   5               15

感谢您的帮助 : - )

1 个答案:

答案 0 :(得分:0)

在SQL的大多数方言中,您可以使用带有相关子查询的update来执行此操作:

UPDATE tab
    SET totalUsed = (SELECT SUM(used)
                     from tab tab2
                     where tab2.name = tab.name and
                           tab2.cid <= tab.cid
                    );

编辑:

以上内容在MySQL中不起作用。你可以这样做:

UPDATE tab join
       (select tab2.cid,
               (SELECT SUM(used)
                from tab tab3
                where tab3.name = tab2.name and
                      tab3.cid <= tab2.cid
               ) as cum_used
        from tab tab2
       ) tab2
       on tab.cid = tab2.cid
    SET tab.totalUsed = tab2.cum_used;