求一SQL写法

lcb530 2012-04-16 02:35:15
有一张表:

名字 发票大类 发票小类 发票号


张三 固定发票 50元固定发票 1001001
张三 固定发票 50元固定发票 1001002
张三 固定发票 50元固定发票 1001003


李四 固定发票 50元固定发票 1001004
李四 固定发票 50元固定发票 1001005
李四 固定发票 50元固定发票 1001006


王五 固定发票 50元固定发票 1001007
王五 固定发票 50元固定发票 1001008


求结果输出:

名字 发票大类 发票小类 起始发票号 终止发票号

张三 固定发票 50元固定发票 1001001 1001003
李四 固定发票 50元固定发票 1001004 1001006
王五 固定发票 50元固定发票 1001007 1001008

...全文
268 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
BI_expert 2012-04-19
  • 打赏
  • 举报
回复
最好最简单的应该用decode()函数
mg_chen 2012-04-18
  • 打赏
  • 举报
回复
WITH t AS
(SELECT '张三' AS userName, '固定发票' AS classes, '50元固定发票' AS subClasses,
'1001001' AS code
FROM dual
UNION ALL
SELECT '张三', '固定发票', '50元固定发票', '1001002'
FROM dual
UNION ALL
SELECT '张三', '固定发票', '50元固定发票', '1001003'
FROM dual
UNION ALL
SELECT '李四', '固定发票', '50元固定发票', '1001004'
FROM dual
UNION ALL
SELECT '李四', '固定发票', '50元固定发票', '1001005'
FROM dual
UNION ALL
SELECT '李四', '固定发票', '50元固定发票', '1001006'
FROM dual
UNION ALL
SELECT '张三', '固定发票', '50元固定发票', '1001009'
FROM dual
UNION ALL
SELECT '张三', '固定发票', '50元固定发票', '1001007' FROM dual)

select username, classes, subclasses,min(code), max(code) from (
select username, classes, subclasses,code, to_number(code)- row_number() over(partition by username, classes, subclasses order by code) F5
from t
order by username, classes, subclasses, code)
group by username, classes, subclasses,F5
appleqwfyhw 2012-04-16
  • 打赏
  • 举报
回复
select
t.名字 ,
t.发票大类,
t.发票小类,
t.min(发票号),
t.max(发票号)
from
(
select
名字 ,
发票大类,
发票小类,
发票号,
row_number() over(partition by 名字 order by 发票号) rn
from table
) t
group by 名字 ,t.发票大类,t.发票小类,t.rn-t.发票号

-----说明------
1.先按 姓名 发票种类 发票编号从小到大排序,并记录行号 如下
用张三举例:
张三 固定发票 50元固定发票 1001001 1
张三 固定发票 50元固定发票 1001002 2
张三 固定发票 50元固定发票 1001003 3
张三 固定发票 50元固定发票 1001007 4
张三 固定发票 50元固定发票 1001008 5

2.接着重点来了
1001001,1001002,1001003 他们是连号最后输出就是最小和最大 也就是
张三 固定发票 50元固定发票 1001001 1001003

1001007和1001003隔断了 就另起一组 它和1001008又是连号的
就显示为
张三 固定发票 50元固定发票 1001007 1001008
3.核心思路来了
1001001 1 0
1001002 2 0
1001003 3 0
1001007 4 3
1001008 5 3

group by rn-发票号 取max min

代码未经测试,懒得建表导数据,思路告诉你了,请给分!多谢













啊彪123 2012-04-16
  • 打赏
  • 举报
回复
ls牛逼!@
hupeng213 2012-04-16
  • 打赏
  • 举报
回复
--试试这个,先按username排序,然后再做分类处理,最后再把分类信息抛弃,
WITH t AS
(SELECT '张三' AS userName,
'固定发票' AS classes,
'50元固定发票' AS subClasses,
'1001001' AS code
FROM dual
UNION ALL
SELECT '张三','固定发票','50元固定发票','1001002' FROM dual
UNION ALL
SELECT '张三','固定发票','50元固定发票','1001003' FROM dual
UNION ALL
SELECT '李四','固定发票','50元固定发票','1001004' FROM dual
UNION ALL
SELECT '李四','固定发票','50元固定发票','1001005' FROM dual
UNION ALL
SELECT '李四','固定发票','50元固定发票','1001006' FROM dual
UNION ALL
SELECT '张三','固定发票','50元固定发票','1001007' FROM dual
UNION ALL
SELECT '张三','固定发票','50元固定发票','1001008' FROM dual
)
select username,classes,subclasses,min(code) ,max(code) from (
select username,classes,subclasses,code,code-rownum as a from (
select * from t order by username,classes,subclasses,code
)
) group by username,classes,subclasses,a
--结果
USERNAME CLASSES SUBCLASSES MIN(CODE) MAX(CODE)
-------- -------- ------------ --------- ---------
李四 固定发票 50元固定发票 1001004 1001006
张三 固定发票 50元固定发票 1001001 1001003
张三 固定发票 50元固定发票 1001007 1001008
forgetsam 2012-04-16
  • 打赏
  • 举报
回复
with t as(
select '张三' username, '固定发票' dl, '50元固定发票' xl, 1001001 bh from dual
union all select '张三' , '固定发票' , '50元固定发票', 1001002 from dual
union all select '张三' , '固定发票' , '50元固定发票', 1001003 from dual

union all select '李四', '固定发票', '50元固定发票' , 1001004 from dual
union all select '李四', '固定发票', '50元固定发票' , 1001005 from dual
union all select '李四', '固定发票', '50元固定发票' , 1001006 from dual

union all select '王五', '固定发票', '50元固定发票' , 1001007 from dual
union all select '王五', '固定发票', '50元固定发票' , 1001008 from dual

)
select username,dl,xl,min(bh),max(bh) from
(select username,dl,xl,bh,bh-row_number() over(partition by username,dl,xl,order by bh xxl from t) group by username,dl,xl,xxl;
lcb530 2012-04-16
  • 打赏
  • 举报
回复
我是楼主:
难点在于,按username分组的时候,因为‘张三’要分为两段
lcb530 2012-04-16
  • 打赏
  • 举报
回复
我是楼主:
不好意思,我的描述有点问题,原始需求是:

username dl xl bh
张三 固定发票 50元固定发票 1001001
张三 固定发票 50元固定发票 1001002
张三 固定发票 50元固定发票 1001003
李四 固定发票 50元固定发票 1001004
李四 固定发票 50元固定发票 1001005
李四 固定发票 50元固定发票 1001006
张三 固定发票 50元固定发票 1001007
张三 固定发票 50元固定发票 1001008

求结果输出:
username dl xl min_bh max_bh
张三 固定发票 50元固定发票 1001001 1001003
李四 固定发票 50元固定发票 1001004 1001006
张三 固定发票 50元固定发票 1001007 1001008
啊彪123 2012-04-16
  • 打赏
  • 举报
回复
1 王五 固定发票 50元固定发票 1001007 1001008
2 张三 固定发票 50元固定发票 1001001 1001003
3 李四 固定发票 50元固定发票 1001004 1001006
啊彪123 2012-04-16
  • 打赏
  • 举报
回复
with t as(
select '张三' username, '固定发票' dl, '50元固定发票' xl, 1001001 bh from dual
union all select '张三' , '固定发票' , '50元固定发票', 1001002 from dual
union all select '张三' , '固定发票' , '50元固定发票', 1001003 from dual

union all select '李四', '固定发票', '50元固定发票' , 1001004 from dual
union all select '李四', '固定发票', '50元固定发票' , 1001005 from dual
union all select '李四', '固定发票', '50元固定发票' , 1001006 from dual

union all select '王五', '固定发票', '50元固定发票' , 1001007 from dual
union all select '王五', '固定发票', '50元固定发票' , 1001008 from dual

)
select username,dl,xl,min(bh),max(bh) from t group by username,dl,xl;
lcb530 2012-04-16
  • 打赏
  • 举报
回复
不是这个原因,你上面的SQL只能查询出两条记录,我要求的查询结果和你写的SQL有点出入,你可以测试一下
啊彪123 2012-04-16
  • 打赏
  • 举报
回复
你的发票号是字符型的?to_number转成number
lcb530 2012-04-16
  • 打赏
  • 举报
回复
我是楼主:
上面各位大仙的SQL不符合要求,请先测试一下
lcb530 2012-04-16
  • 打赏
  • 举报
回复
上面各位大仙的SQL不符合要求,请先测试一下
五更琉璃 2012-04-16
  • 打赏
  • 举报
回复
select 名字,发票大类,发票小类,min(发票号) as 起始发票号,max(发票号) 终止发票号
from table
group by 名字,发票大类,发票小类
中国风 2012-04-16
  • 打赏
  • 举报
回复
select
名字, 发票大类, 发票小类,
min(发票号) as 起始发票号,
max(发票号) as 终止发票号
from TableName
group by 名字, 发票大类, 发票小类
啊彪123 2012-04-16
  • 打赏
  • 举报
回复

select 名字,发票大类,发票小类,max(发票号),min(发票号)
from table group by 名字,发票大类,发票小类

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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