从上一个完整行

时间:2017-08-14 15:16:25

标签: mysql

我有一个正在迁移到MySQL数据库的电子表格。将来电子表格将无法填写。数据将直接上传到数据库。电子表格现在有两个表格。一个名为Piles,包含产品信息。另一个称为Cubes,包含对产品执行的测试结果。这两个表的样本数据如下:

桩:

+----------+------------+---------+-----------------+
| ID       | Date       | MouldID | StockCode       |
+----------+------------+---------+-----------------+
| 23A42895 | 2017-06-09 | 23A     | 250CDJ09.0/0412 |
| 23B42895 | 2017-06-09 | 23B     | 250CDJ07.0/0412 |
| 642895   | 2017-06-09 | 6       | 250CDJ09.0/0412 |
| 8642895  | 2017-06-09 | 86      | 250CDJ07.0/0412 |
| 842895   | 2017-06-09 | 8       | 250CDJ09.0/0412 |
+----------+------------+---------+-----------------+

立方体:

+---------+------------+-------------+---------+
| ID      | Date       | ConcTotalM3 | MouldID |
+---------+------------+-------------+---------+
| 2342895 | 2017-06-09 |        18.1 |      23 |
| 4842895 | 2017-06-09 |        57.9 |      48 |
|  842895 | 2017-06-09 |       108.4 |       8 |
| 1542895 | 2017-06-09 |       154.7 |      15 |
| 6242895 | 2017-06-09 |       204.6 |      62 |
+---------+------------+-------------+---------+

现在手动填写电子表格。当模具ID和日期匹配时,信息全部写在一行上。然后向下拖动立方体表中的数据,直到找到另一个匹配的行并重复该过程。

我的问题是,如何编写一个输出相同的SQL查询。我可以编写一个在日期和MouldID上加入的查询,但这不会导致数据向下拖动#34;请注意,如果MouldID的数字部分匹配,那么该行匹配。 A和B无关紧要。我已经从样本数据中包含了我期望输出的内容以供参考。

+----------+------------+---------+-----------------+-------------+
| ID       | Date       | MouldID | StockCode       | ConcTotalM3 |
+----------+------------+---------+-----------------+-------------+
| 23A42895 | 2017-06-09 | 23A     | 250CDJ09.0/0412 |        18.1 |
| 23B42895 | 2017-06-09 | 23B     | 250CDJ07.0/0412 |        18.1 |
| 642895   | 2017-06-09 | 6       | 250CDJ09.0/0412 |        18.1 |
| 8642895  | 2017-06-09 | 86      | 250CDJ07.0/0412 |        18.1 |
| 842895   | 2017-06-09 | 8       | 250CDJ09.0/0412 |       108.4 |
+----------+------------+---------+-----------------+-------------+

编辑: 所以我为了清晰起见删除了一些列,因为我认为这是令人困惑的事情。我没有使用MouldID加入。目前我正在使用一个脚本告诉我字母在字符串中的位置。然后我使用left()来获取数字部分。

我无法做的就是让联接工作以使用最后一场比赛,如果它不能与当前行匹配。为了解释我的示例输出,前两行是匹配,因为Cubes表中有一个模具23。模具6没有匹配,因此它使用最后一个匹配(来自上面的行)。对于模具86也是如此。模具8在Cubes表中确实具有匹配,因此它使用它。 我希望这会让事情更加清晰。感谢

SQL小提琴供参考: http://sqlfiddle.com/#!9/6f19df/2

1 个答案:

答案 0 :(得分:2)

您可以使用一对嵌套替换来避免A,B并与cubes.ID匹配

    select 
      Date
      , a.MouldID
      , a.StockCode
      , a.Length 
      , a.Serials
      , a.PrintNum
      , b.ConcTotalM3
      , b.Quantity
      , b.Time 
      ....
    from  Piles a
    inner join Cubes b on replace(replace(a.ID, 'A', '') , 'B','') = b.id

向你的sqlfiddle看这场比赛

  a.Date
  , a.ID
  , b.ID
  , replace(replace(a.ID, 'A', '') , 'B','')
  , a.MouldID
  , a.StockCode
  , b.ConcTotalM3
from  Piles a
inner join Cubes b on replace(replace(a.ID, 'A', '') , 'B','') = b.ID