根据列数据丢失行--MySQL

时间:2017-08-23 03:33:02

标签: mysql sql .net

我目前正在开发一个.net网络表单解决方案,它为管理员生成一份简短的服务报告,以监控技术人员所做的服务。截至目前,我在提出高效的SQL(MySQl)方面遇到了一些麻烦根据SertvicePrtNum按顺序返回数据行和缺失的行。 例如 :- 这是表格中的原始数据: -

Id    ServiceRptNum  Customer_ID  Date of Service 
----  -------------  -----------  ---------------
1      1001              3        09/10/1997
2      1003              8        10/06/2005 
3      1005              1        21/02/2003
4      1007              7        1/06/2011
5      1010              4        4/11/2012
6      1002              2        16/01/2003

此处表中缺少 ServiceRptNum 1004 。所以我希望db将结果返回为: -

Id    ServiceRptNum  Customer_ID  Date of Service 
----  -------------  -----------  ---------------
1      1001              3        09/10/1997
2      1002              2        16/01/2003
3      1003              8        10/06/2005 
-      1004              -            - 
4      1005              1        21/02/2003
-      1006              -            -
5      1007              7        1/06/2011
-      1008              -            - 
-      1009              -            -
6      1010              4        4/11/2012

这里,sql另外生成了1004,1006,1008,1009,因为它无法找到那些记录。

请注意,在插入数据时会自动生成ID(auto_increment)。但是Service ReportNum不是,这是为了让管理员稍后使用手动生成的报告Num添加服务报告(报告num in公司服务手册的硬拷贝。)

2 个答案:

答案 0 :(得分:1)

查看here有关如何生成一组连续整数的想法,然后从左外连接中选择您的表。您应该为每个数字获取一行,但缺少的数字的所有值都将为空。

答案 1 :(得分:1)

你基本上需要发明一个恒定的,连续的数字流,然后将你的真实数据加入它们。要使此方法起作用,您需要一个包含足够行的表来生成足够大的计数器:

select ID, 1000+n as servicerptnum, customer_id, `Date of Service` from
(
 SELECT  @curRow := @curRow + 1 AS n
 FROM    somebigtable 
 JOIN    (SELECT @curRow := 0) r
 WHERE   @curRow<100
) numbergen
LEFT JOIN
tablewithmissingservicerptnum
ON
  servicerptnum = 1000+n

您需要更改上面代码中的一些内容,因为您从未告诉我们您的表名称缺少rptnums。您还需要在数据库中使用比此表更多行的另一个表,因为此方法的工作方式是计算较大表中的行,每个表都有一个数字。如果你没有比这个更大的表,我们可以通过将较小的表交叉连接到自身或使​​用此表来获得足够的行。将somebigtable替换为thistable CROSS JOIN thistable,其中此表是缺少servicerptnums的表的名称

如果您只想要缺少的行,请在SQL的末尾添加WHERE servicerptnum is null

编辑,我看到你改变了你的编号:

1001
1002
...
1009
10010

要:

1009
1010

加入条件曾是servicerptnum = concat('100', cast(n as varchar)),现在是servicerptnum = 1000+n ..