如果字段为空,则将MySQL行与前一行合并
我正在尝试使用一个MySQL数据库,它的描述分布在多行上(从CSV文件导入),并将除描述以外的所有内容都为空的行组合起来,以完成描述字段 从这一点开始:如果字段为空,则将MySQL行与前一行合并,mysql,csv,where,rows,Mysql,Csv,Where,Rows,我正在尝试使用一个MySQL数据库,它的描述分布在多行上(从CSV文件导入),并将除描述以外的所有内容都为空的行组合起来,以完成描述字段 从这一点开始: ID PLU Description 100 1 Line 1 101 Line 2 102 2 Line 3 103 3 Line 4 105 Line 5 106 Line 6 试着把它变成这样: ID PLU
ID PLU Description
100 1 Line 1
101 Line 2
102 2 Line 3
103 3 Line 4
105 Line 5
106 Line 6
试着把它变成这样:
ID PLU Description
100 1 Line 1 Line 2
102 2 Line 3
103 3 Line 4 Line 5 Line 6
任何想法都将不胜感激
编辑:
为了添加一些背景信息,我收到了一份以CSV格式发送的价目表,不幸的是,我无法更改传入的格式。如果一个项目的描述太长,它将在下一个单元格中继续,留下许多只包含描述的行。我希望找到一种方法,将单独的描述行附加到作为有效行一部分的描述中。如果在数据仍然是CSV的情况下有更简单的方法,我当然也愿意这样做。请参阅我的原始评论,但这可能有用:
SET @prevPLU := 0;
SET @firstID := 0;
SELECT MIN(ID) AS ID
, @prevPLU := IF(PLU='',@prevPLU, PLU) AS actualPLU
, GROUP_CONCAT(Description ORDER BY ID SEPARATOR ' ') AS Description
FROM theTable
GROUP BY actualPLU
;
为此,有两个步骤: 首先,您需要填写缺少的PLU值。正如其他人在评论中所说,如果可能的话,您应该在加载数据时这样做。如果必须使用SQL,那么下面是如何()让我强调一下,这是一个卑鄙的黑客行为,因为它违反了SQL的声明式工作方式
SELECT ID,
CASE WHEN PLU IS NOT NULL
THEN @prev:=PLU
ELSE @prev END PLU,
Description
FROM tbl
JOIN (SELECT @prev:=NULL) init
ORDER BY ID
接下来,使用GROUPBY汇总此子查询/虚拟表。()
为什么PLU是空白的,从定义上来说,这几乎是糟糕的数据。听起来你可以在导入之前或导入时快速而简单地做一些事情。你能分享原始格式吗?我只是想大声说出来,如果你得到的csv文件在excel中正确打开(excel在这方面非常好),只要导入正确的格式。我认为这比编写复杂的sql代码来获得完整的描述要好得多。@NKD我添加了一些背景知识,试图更好地解释我在做什么。@Ar3n您能提供csv格式的示例(可能有2条记录)吗?我希望得到一个csv版本的示例,看看我是否可以帮助您想出一种在加载之前/加载时清理它的方法。最好是避免数据库中的坏数据完整性。我在op中添加了一些背景信息(作为对您原始评论的回应)。
SELECT MIN(ID) ID,
PLU,
GROUP_CONCAT(Description ORDER BY Description SEPARATOR ' ') Description
FROM (
SELECT ID,
CASE WHEN PLU IS NOT NULL
THEN @prev:=PLU
ELSE @prev END PLU,
Description
FROM tbl
JOIN (SELECT @prev:=NULL) init
ORDER BY ID
) t
GROUP BY PLU