我目前正在开发一个.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公司服务手册的硬拷贝。)
答案 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
..