是否有一个mySQL过程可以将重复的数据行合并为一行,然后允许我像处理一行一样处理该数据?

是否有一个mySQL过程可以将重复的数据行合并为一行,然后允许我像处理一行一样处理该数据?,mysql,sql,Mysql,Sql,我试图提出一个存储过程,它将多个完全相同的行合并成一行,同时对一列求和,然后可以基于这一列的和运行更多的存储过程 我尝试了一个groupby语句,但实际上并没有将行分组在一起,因为如果我通过另一个过程运行表,它会执行一些操作,就好像没有合并每一行一样。执行一个SELECT*fromMyTable查询显示每一行实际上并没有合并成一行 有没有办法将多行永久合并为一行 首先,我有一张这样的桌子: +-------+-----+--------+---------+------+-----+------

我试图提出一个存储过程,它将多个完全相同的行合并成一行,同时对一列求和,然后可以基于这一列的和运行更多的存储过程

我尝试了一个
groupby
语句,但实际上并没有将行分组在一起,因为如果我通过另一个过程运行表,它会执行一些操作,就好像没有合并每一行一样。执行一个
SELECT*fromMyTable
查询显示每一行实际上并没有合并成一行

有没有办法将多行永久合并为一行

首先,我有一张这样的桌子:

+-------+-----+--------+---------+------+-----+-----------+
| RowID | pID |  Name  |  Date   | Code | QTY | Purchased |
+-------+-----+--------+---------+------+-----+-----------+
|     1 |   1 | bob    | 9/29/20 |  123 |   1 |           |
|     2 |   1 | bob    | 8/10/20 |  456 |   1 |           |
|     3 |   2 | rob    | 9/15/20 |  123 |   1 |           |
|     4 |   2 | rob    | 9/15/20 |  123 |   1 |           |
|     5 |   2 | rob    | 9/15/20 |  123 |   1 |           |
|     6 |   2 | rob    | 9/15/20 |  123 |   1 |           |
|     7 |   2 | rob    | 9/15/20 |  123 |   1 |           |
|     8 |   3 | john   | 7/12/20 |  987 |   1 |           |
|     9 |   3 | john   | 7/12/20 |  987 |   1 |           |
|    10 |   4 | george | 9/12/20 |  684 |   1 |           |
|    11 |   5 | paul   | 2/2/20  |  454 |   1 |           |
|    12 |   6 | amy    | 1/12/20 |  252 |   1 |           |
|    13 |   7 | susan  | 5/30/20 |  131 |   1 |           |
|    14 |   7 | susan  | 6/6/20  |  252 |   1 |           |
|    15 |   7 | susan  | 5/30/20 |  131 |   1 |           |
+-------+-----+--------+---------+------+-----+-----------+
+-------+-----+--------+---------+------+-----+-----------+
| RowID | pID |  Name  |  Date   | Code | QTY | Purchased |
+-------+-----+--------+---------+------+-----+-----------+
|     1 |   1 | bob    | 9/29/20 |  123 |   1 |           |
|     2 |   1 | bob    | 8/10/20 |  456 |   1 |           |
|     3 |   2 | rob    | 9/15/20 |  123 |   5 |           |
|     4 |   3 | john   | 7/12/20 |  987 |   2 |           |
|     5 |   4 | george | 9/12/20 |  684 |   1 |           |
|     6 |   5 | paul   | 2/2/20  |  454 |   1 |           |
|     7 |   6 | amy    | 1/12/20 |  252 |   1 |           |
|     8 |   7 | susan  | 5/30/20 |  131 |   2 |           |
|     9 |   7 | susan  | 6/6/20  |  252 |   1 |           |
+-------+-----+--------+---------+------+-----+-----------+
最后,我想要一张这样的桌子:

+-------+-----+--------+---------+------+-----+-----------+
| RowID | pID |  Name  |  Date   | Code | QTY | Purchased |
+-------+-----+--------+---------+------+-----+-----------+
|     1 |   1 | bob    | 9/29/20 |  123 |   1 |           |
|     2 |   1 | bob    | 8/10/20 |  456 |   1 |           |
|     3 |   2 | rob    | 9/15/20 |  123 |   1 |           |
|     4 |   2 | rob    | 9/15/20 |  123 |   1 |           |
|     5 |   2 | rob    | 9/15/20 |  123 |   1 |           |
|     6 |   2 | rob    | 9/15/20 |  123 |   1 |           |
|     7 |   2 | rob    | 9/15/20 |  123 |   1 |           |
|     8 |   3 | john   | 7/12/20 |  987 |   1 |           |
|     9 |   3 | john   | 7/12/20 |  987 |   1 |           |
|    10 |   4 | george | 9/12/20 |  684 |   1 |           |
|    11 |   5 | paul   | 2/2/20  |  454 |   1 |           |
|    12 |   6 | amy    | 1/12/20 |  252 |   1 |           |
|    13 |   7 | susan  | 5/30/20 |  131 |   1 |           |
|    14 |   7 | susan  | 6/6/20  |  252 |   1 |           |
|    15 |   7 | susan  | 5/30/20 |  131 |   1 |           |
+-------+-----+--------+---------+------+-----+-----------+
+-------+-----+--------+---------+------+-----+-----------+
| RowID | pID |  Name  |  Date   | Code | QTY | Purchased |
+-------+-----+--------+---------+------+-----+-----------+
|     1 |   1 | bob    | 9/29/20 |  123 |   1 |           |
|     2 |   1 | bob    | 8/10/20 |  456 |   1 |           |
|     3 |   2 | rob    | 9/15/20 |  123 |   5 |           |
|     4 |   3 | john   | 7/12/20 |  987 |   2 |           |
|     5 |   4 | george | 9/12/20 |  684 |   1 |           |
|     6 |   5 | paul   | 2/2/20  |  454 |   1 |           |
|     7 |   6 | amy    | 1/12/20 |  252 |   1 |           |
|     8 |   7 | susan  | 5/30/20 |  131 |   2 |           |
|     9 |   7 | susan  | 6/6/20  |  252 |   1 |           |
+-------+-----+--------+---------+------+-----+-----------+

将完全相同的行合并为一行,并对“数量”字段进行求和,然后我可以将采购添加到其中,或将数量作为总数进行扣除。使用GROUP BY语句可以实现这一点,但当我更改数量或向每个人添加购买时,它会将其视为第一个表,好像没有实际分组一样。

因此您有这个表:

| RowID | pID |  Name  |  Date   | Code | QTY | Purchased |
+-------+-----+--------+---------+------+-----+-----------+
|     1 |   1 | bob    | 9/29/20 |  123 |   1 |           |
|     2 |   1 | bob    | 8/10/20 |  456 |   1 |           |
|     3 |   2 | rob    | 9/15/20 |  123 |   1 |           |
|     4 |   2 | rob    | 9/15/20 |  123 |   1 |           |
|     5 |   2 | rob    | 9/15/20 |  123 |   1 |           |
|     6 |   2 | rob    | 9/15/20 |  123 |   1 |           |
|     7 |   2 | rob    | 9/15/20 |  123 |   1 |           |
|     8 |   3 | john   | 7/12/20 |  987 |   1 |           |
|     9 |   3 | john   | 7/12/20 |  987 |   1 |           |
|    10 |   4 | george | 9/12/20 |  684 |   1 |           |
|    11 |   5 | paul   | 2/2/20  |  454 |   1 |           |
|    12 |   6 | amy    | 1/12/20 |  252 |   1 |           |
|    13 |   7 | susan  | 5/30/20 |  131 |   1 |           |
|    14 |   7 | susan  | 6/6/20  |  252 |   1 |           |
|    15 |   7 | susan  | 5/30/20 |  131 |   1 |           |
正如所建议的那样,最好的方法是使用查询内容创建一个新表,然后重命名旧表,并将新表重命名为原始表的名称,检查是否一切正常,如果是,则删除原始表

CREATE TABLE indata_new AS
WITH grp AS (
  SELECT
    MIN(rowid) AS orowid
  , pid
  , name
  , MAX(date) AS date
  , code
  , SUM(qty) AS qty
  FROM indata
  GROUP BY
    pid
  , name
  , code
)
SELECT
  ROW_NUMBER() OVER(ORDER BY orowid ASC) AS rowid
, *
FROM grp;

ALTER TABLE indata RENAME TO indata_old;
ALTER TABLE indata_new RENAME TO indata;
-- if "indata" now contains the data you want ...
SELECT * FROM indata;
-- out  rowid | orowid | pid |  name  |    date    | code | qty 
-- out -------+--------+-----+--------+------------+------+-----
-- out      1 |      1 |   1 | bob    | 2020-09-29 |  123 |   1
-- out      2 |      2 |   1 | bob    | 2020-08-10 |  456 |   1
-- out      3 |      3 |   2 | rob    | 2020-09-15 |  123 |   5
-- out      4 |      8 |   3 | john   | 2020-07-12 |  987 |   2
-- out      5 |     10 |   4 | george | 2020-09-12 |  684 |   1
-- out      6 |     11 |   5 | paul   | 2020-02-02 |  454 |   1
-- out      7 |     12 |   6 | amy    | 2020-01-12 |  252 |   1
-- out      8 |     13 |   7 | susan  | 2020-05-30 |  131 |   2
-- out      9 |     14 |   7 | susan  | 2020-06-06 |  252 |   1

-- you can ...
DROP TABLE indata_old;

“有没有办法将多行永久合并为一行?”-您必须根据分组依据查询创建一个新表。是否确实要丢失原始表中的数据?分组是指更改查询结果。不是原始数据。您是否需要将
RowID
列设置为您所说的那样,即作为一系列不间断的整数?它不能是
pID
date
组合中的序列号吗?请为您的表提供CREATE TABLE语句。