1.用户在日常支付报表中询问账单号的使用情况,希望以类似于5-6、9-10、12-20的方式展示,直观反映账单号的实际使用情况。
经过分析,我们发现实现这一需求主要有两个难点:
1.如果要找出断数并用SQL语句实现,主要考虑性能;
2.将排除断号段的多条记录转换成一行显示,即用SQL实现行列转换;
如果是用编程实现,这两点都不难,但如果是用SQL实现,就需要一些技巧了。
假设使用的票据编号为3、4、5、7、8、11、12,最小为3,最大为12,查找断号的SQL如下:
选择Rownum + (3 - 1)
从双重
通过Rownum & lt= 12 - (3 - 1)
负的
从表中选择Column _ Value Txt(Cast(zltools . f _ num 2 list(' 3,4,5,7,8,11,12') As Zltools.t_Numlist))
结果是三个记录,6、9和10。
使用的技术之一是使用Connect by Rownum来生成按顺序增长的记录集。
转换成一行显示的已用账单段的SQL如下:
测试为(
select _ value number from table(cast(zltools . f _ num 2 list(' 3,4,5,7,8,11,12') as zltools.t _ numlist))
)
选择Substr(Max(LPAD(长度(段),5,' 0') ||段),7,1000)作为段
来自(
Select _ connect _ by _ path (segment,',')作为段
来自(
选择Rownum作为行号,a .起始号||'-'|| (b .中断号-1)作为段
来自(
选择Rownum作为行号,number作为起始号
来自(
从测试中选择号码
负的
从测试中选择数字+1)
)A,
(选择Rownum作为行号,number作为中断号来自(
从测试中选择数字+1作为数字
负的
从测试中选择)
)B
A.行号= B .行号)
从行号= 1开始
连接方式(行号-1) =前一个行号)
结果:3-5,7-8,11-12
使用了以下技术:
1.用减号的方式找到所用号段的起始号和结束号的记录集。
2.利用Sys_Connect_By_Path函数和树形查询实现多行记录到一列的转换。
3.使用substr、max、lpad和length函数的组合来查找最长的记录。
如果是oracle 10G或更高版本,可以使用一个新函数Wmsys。Wm_Concat,比之前的树查询快多了。
测试为(
select _ value number from table(cast(zltools . f _ num 2 list(' 3,4,5,7,8,11,12') as zltools.t _ numlist))
)
选择Wmsys。Wm_Concat(分段)作为分段
来自(
选择Rownum作为行号,a .起始号||'-'|| (b .中断号-1)作为段
来自(
选择Rownum作为行号,number作为起始号
来自(
从测试中选择号码
负的
从测试中选择数字+1)
)A,
(选择Rownum作为行号,number作为中断号来自(
从测试中选择数字+1作为数字
负的
从测试中选择)
)B
A.行号= B .行号)
关键词:SQL语句
优侠库网站每天提供最新最热门的安卓手机软件、游戏下载、分享热门手游资讯攻略教程、手机软件教程步骤,专注安卓手机游戏软件下载。本文链接:http://www.123down.cn/gonglue/227157.html