如何对重复键上列的值求和?

How to sum the values of column on duplicate key?

我有一个 table 这样的:

// mytable
+----+--------+-------+-------+
| id |  name  |  key  | value |
+----+--------+-------+-------+
| 1  | jack   | 1     | 10    |
| 2  | peter  | 1     | 5     |
| 3  | jack   | 2     | 5     |
| 4  | ali    | 1     | 2     |
| 5  | jack   | 1     | 5     |
| 6  | jack   | 1     | 10    |
| 7  | bert   | 4     | 2     |
| 8  | peter  | 2     | 10    |
| 9  | bert   | 4     | 5     |
+----+--------+-------+-------+  

现在我想对 value 的数字求和,其中 namekey 是相同的。所以,我想要这个输出:

// mynewtable
+----+--------+-------+-------+
| id |  name  |  key  | value |
+----+--------+-------+-------+
| 1  | jack   | 1     | 25    |
| 2  | peter  | 1     | 5     |
| 3  | jack   | 2     | 5     |
| 4  | ali    | 1     | 2     |
| 7  | bert   | 4     | 7     |
| 8  | peter  | 2     | 10    |
+----+--------+-------+-------+ 

我可以这样做吗?


编辑: 我怎样才能做到 insert

// mytable
+----+--------+-------+-------+
| id |  name  |  key  | value |
+----+--------+-------+-------+
| 1  | jack   | 1     | 25    |
| 2  | peter  | 1     | 5     |
| 3  | jack   | 2     | 5     |
| 4  | ali    | 1     | 2     |
| 7  | bert   | 4     | 7     |
| 8  | peter  | 2     | 10    |
+----+--------+-------+-------+ 

正在插入这些行:

    +----+--------+-------+-------+ 
    | 10 | jack   | 1     | 5     |
    +----+--------+-------+-------+ 
    +----+--------+-------+-------+ 
    | 11 | bert   | 1     | 2     |
    +----+--------+-------+-------+

我想要的:(输出)

// mynewtable
+----+--------+-------+-------+
| id |  name  |  key  | value |
+----+--------+-------+-------+
| 1  | jack   | 1     | 30    |
| 2  | peter  | 1     | 5     |
| 3  | jack   | 2     | 5     |
| 4  | ali    | 1     | 2     |
| 7  | bert   | 4     | 7     |
| 8  | peter  | 2     | 10    |
| 11 | bert   | 1     | 2     |
+----+--------+-------+-------+ 

您必须按更多列进行分组。

select name, key, sum(value) from mytable group by name, key;

检查这个

CREATE TABLE #testing_123
    ([id] int, [name] varchar(5), [key] int, [value] int)
;

INSERT INTO #testing_123
    ([id], [name], [key], [value])
VALUES
    (1, 'jack', 1, 10),
    (2, 'peter', 1, 5),
    (3, 'jack', 2, 5),
    (4, 'ali', 1, 2),
    (5, 'jack', 1, 5),
    (6, 'jack', 1, 10),
    (7, 'bert', 4, 2),
    (8, 'peter', 2, 10),
    (9, 'bert', 4, 5)
;

使用的查询是

select min(id) id ,name,[key],sum(value) value from #testing_123 group by name,[key] order by 1

插入后的输出

分组依据name, key

 select name, key, sum(value) as value 
 from mytable group by name,key

对于第一部分(以请求的方式获取 id 列),您可以一起工作:

INSERT INTO mynewtable
    (id, name, `key`, `value`)
SELECT
  MIN(id), name, `key`, SUM(`value`)
FROM mytable
GROUP BY name, `key`
;

现在,如果 mynewtablenamekey[ 上定义了唯一索引=35=]喜欢

CREATE TABLE mynewtable
(id INT, name VARCHAR(5), `key` INT, `value` INT, UNIQUE (name, `key`));

你会得到请求的结果

INSERT INTO mynewtable
    (id, name, `key`, `value`)
VALUES
    (10, 'jack', 1, 5),
    (11, 'bert', 1, 2)
ON DUPLICATE KEY UPDATE `value` = `value` + VALUES(`value`)
;

注意:

  • 它需要 namekey 上的唯一索引才能工作。
  • 如果在同一个 table 上还有其他唯一索引 and/or 主键,它可能无法正常工作。

注意: 请尽量避免使用 valuekey 等保留字,例如列名。