ORACLE sql语句问题,请帮忙看看。

zhbl 2008-11-14 04:37:26
我有一个执收码表(zs_billinfo),里面有个票据号码字段(startno)比如内容是 00001到10000啥的,但是中间有些票据号码缺少, 比如少00005,00010等,我现在需要把它按号码段统计出来。就是00001-00004为一段,00006-00009为一段,00011-10000为一段(因为我需要根据这些票段来统计金额,数量什么的东西),这个sql有没有办法做到呢?
原表格式
startno
00001
00002
00003
00004
00006
00007
00008
00009
00011
00012
...

现在表格式
startno endno
00001 00004
00006 00009
00011 10000
...全文
204 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰糖_adam 2008-11-16
  • 打赏
  • 举报
回复
学习
MrLovelyXinXin 2008-11-16
  • 打赏
  • 举报
回复
但是对这个表进行二次操作可能会有问题啊
inanition 2008-11-15
  • 打赏
  • 举报
回复
如果你的StartNo是有序且不会改变的值(例如递增字段),ROWNUM的方法就不会有问题了.

ROWNUM是随着记录的增加而递增的,而且当某条记录被删除时,所有ROWNUM大于当前ROWNUM的都会减1,就是说ROWNUM永远都是不会有间隙的,从1开始,直到你的记录总数.

icss_zhen 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wfqqwer5213 的回复:]
MS逻辑还有点问题
rownum no
1 1
2 3
3 6
4 7
5 10
. .
. .
. .
100 103

按照LS各位的思路
6到103都成一组了!
[/Quote]你这种是根本不可能的情况,因为当no=10的时候,rownum=5也就是说no-rownum=5,那么后面的no与其对应的rownum之间的差最小也是等于5,如果后面就断的就会大于5,而不可能小于5,所以你说的当no=103时,rownum=100是不可能的,因为103-100=3
mantisXF 2008-11-14
  • 打赏
  • 举报
回复
这种情况出现的几率不大,如果有先按STARTNO列排序后再STARTNO-ROWNUM就好了。
[Quote=引用 11 楼 wfqqwer5213 的回复:]
MS逻辑还有点问题
rownum no
1 1
2 3
3 6
4 7
5 10
. .
. .
. .
100 103

按照LS各位的思路
6到103都成一组了!
[/Quote]
wfqqwer5213 2008-11-14
  • 打赏
  • 举报
回复
MS逻辑还有点问题
rownum no
1 1
2 3
3 6
4 7
5 10
. .
. .
. .
100 103

按照LS各位的思路
6到103都成一组了!
icss_zhen 2008-11-14
  • 打赏
  • 举报
回复

DROP TABLE ZS_BILLINFO;
CREATE TABLE ZS_BILLINFO(STARTNO VARCHAR2(10));

SELECT * FROM ZS_BILLINFO;
STARTNO
1 00001
2 00002
3 00003
4 00004
5 00006
6 00007
7 00008
8 00009
9 00011
10 00012
SELECT MIN(STARTNO) STARTNO, MAX(STARTNO) ENDNO
FROM (SELECT STARTNO, STARTNO - ROWNUM RN
FROM ZS_BILLINFO
ORDER BY STARTNO)
GROUP BY RN
ORDER BY RN;


hebo2005 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mantisXF 的回复:]
SQL code-- 连续数问题:
SQL> SELECT MIN(STARTNO) STARTNO,
2 MAX(STARTNO) ENDNO
3 FROM (
4 SELECT STARTNO,
5 STARTNO - ROWNUM RN
6 FROM TABLE_NAME TT
7 )YY
8 GROUP BY RN;

STARTNO ENDNO
------- -----
00001 00004
00006 00009
00011 00012


引用楼主 zhbl 的帖子:
我有一个执收码表(zs_billinfo),里面有个票据…
[/Quote]

这个思路不错
BlueskyWide 2008-11-14
  • 打赏
  • 举报
回复

--try it:

select sum(金额) from zs_billinfo where startno>='00001' and startno<='00004' union
(select sum(金额) from zs_billinfo where startno>='00006' and startno<='00009') union
(select sum(金额) from zs_billinfo where startno>='00011' and startno<='10000');



[Quote=引用楼主 zhbl 的帖子:]
我有一个执收码表(zs_billinfo),里面有个票据号码字段(startno)比如内容是 00001到10000啥的,但是中间有些票据号码缺少, 比如少00005,00010等,我现在需要把它按号码段统计出来。就是00001-00004为一段,00006-00009为一段,00011-10000为一段(因为我需要根据这些票段来统计金额,数量什么的东西),这个sql有没有办法做到呢?
原表格式
startno
00001
00002
00003
00004
00006
00007
00008
00009

[/Quote]
hebo2005 2008-11-14
  • 打赏
  • 举报
回复
SELECT   MIN (aaa.startno) startno, MAX (aaa.startno) endno
FROM (SELECT aa.*, SUM (aa.flag) OVER (ORDER BY aa.startno) flag_1
FROM (SELECT a.*,
DECODE
( LEAD (TO_NUMBER (startno),
1,
TO_NUMBER (startno) + 1
) OVER (ORDER BY a.startno)
- TO_NUMBER (startno),
1, 0,
1
) flag
FROM zs_billinfo a) aa)
GROUP BY aaa.flag_1
wfqqwer5213 2008-11-14
  • 打赏
  • 举报
回复
学习
范佩西_11 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 linzhangs 的回复:]
如果你的是字符型的要转换为number型的。再用以上语句
[/Quote]试了下不需要
SQL> select * from ZS_BILLINFO;

STARTNO
----------
00001
00002
00003
00004
00006
00007
00008
00009
00011
00012

10 rows selected

SQL>
SQL> select min(startno) startno, max(startno) endno
2 from ZS_BILLINFO
3 group by (startno - rownum)
4 order by 1;

STARTNO ENDNO
---------- ----------
00001 00004
00006 00009
00011 00012
mantisXF 2008-11-14
  • 打赏
  • 举报
回复
-- 连续数问题:
SQL> SELECT MIN(STARTNO) STARTNO,
2 MAX(STARTNO) ENDNO
3 FROM (
4 SELECT STARTNO,
5 STARTNO - ROWNUM RN
6 FROM TABLE_NAME TT
7 )YY
8 GROUP BY RN;

STARTNO ENDNO
------- -----
00001 00004
00006 00009
00011 00012
[Quote=引用楼主 zhbl 的帖子:]
我有一个执收码表(zs_billinfo),里面有个票据号码字段(startno)比如内容是 00001到10000啥的,但是中间有些票据号码缺少, 比如少00005,00010等,我现在需要把它按号码段统计出来。就是00001-00004为一段,00006-00009为一段,00011-10000为一段(因为我需要根据这些票段来统计金额,数量什么的东西),这个sql有没有办法做到呢?
原表格式
startno
00001
00002
00003
00004
00006
00007
00008
00009

[/Quote]
范佩西_11 2008-11-14
  • 打赏
  • 举报
回复
如果你的是字符型的要转换为number型的。再用以上语句
wfqqwer5213 2008-11-14
  • 打赏
  • 举报
回复
lag或lead比较相邻两个数字之差,>1的就是startno 或 endno 结合decode或case when
范佩西_11 2008-11-14
  • 打赏
  • 举报
回复
SQL> select * from ZS_BILLINFO;

STARTNO
----------
1
2
3
4
6
7
8
9
11
12

10 rows selected

SQL>
SQL> select min(startno) startno, max(startno) endno
2 from ZS_BILLINFO
3 group by (startno - rownum)
4 order by 1;

STARTNO ENDNO
---------- ----------
1 4
6 9
11 12

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧