有一张表:
名字 发票大类 发票小类 发票号
张三 固定发票 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
名字 发票大类 发票小类 发票号
张三 固定发票 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
解决方案 »
- 请问连接oracle的驱动会根据数据库版本不同而变化吗?
- oracle 能不能实现 往视图里添加一条 记录 ,但是不添加到主表
- 用数据结构来模拟一个银行排队系统!
- 怎么用一条SQL语句算出平均分来呢
- oracle存储过程中存取数据问题
- 两个表之间的关联查询问题
- 如何将结果集保存到一个临时表中?
- 求助!MS SQL Server 转换到 Oracle 语法!!!
- 急!!!!请问在ora8中,表名、字段名及字段类型是存在哪些系统表内的?????
- 通过代码循环往数据库中插入数据时报错,求各位大神指点
- oracle 求助 IMP-00037: 未知字符集标记 IMP-00000: 未成功终止导入
- 物化视图,刷新延迟的问题,求教!?
select 名字,发票大类,发票小类,max(发票号),min(发票号)
from table group by 名字,发票大类,发票小类
名字, 发票大类, 发票小类,
min(发票号) as 起始发票号,
max(发票号) as 终止发票号
from TableName
group by 名字, 发票大类, 发票小类
from table
group by 名字,发票大类,发票小类
上面各位大仙的SQL不符合要求,请先测试一下
select '张三' username, '固定发票' dl, '50元固定发票' xl, 1001001 bh from dual
union all select '张三' , '固定发票' , '50元固定发票', 1001002 from dual
union all select '张三' , '固定发票' , '50元固定发票', 1001003 from dualunion all select '李四', '固定发票', '50元固定发票' , 1001004 from dual
union all select '李四', '固定发票', '50元固定发票' , 1001005 from dual
union all select '李四', '固定发票', '50元固定发票' , 1001006 from dualunion 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;
不好意思,我的描述有点问题,原始需求是:
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
难点在于,按username分组的时候,因为‘张三’要分为两段
select '张三' username, '固定发票' dl, '50元固定发票' xl, 1001001 bh from dual
union all select '张三' , '固定发票' , '50元固定发票', 1001002 from dual
union all select '张三' , '固定发票' , '50元固定发票', 1001003 from dualunion all select '李四', '固定发票', '50元固定发票' , 1001004 from dual
union all select '李四', '固定发票', '50元固定发票' , 1001005 from dual
union all select '李四', '固定发票', '50元固定发票' , 1001006 from dualunion 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;
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
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 52.接着重点来了
1001001,1001002,1001003 他们是连号最后输出就是最小和最大 也就是
张三 固定发票 50元固定发票 1001001 10010031001007和1001003隔断了 就另起一组 它和1001008又是连号的
就显示为
张三 固定发票 50元固定发票 1001007 1001008
3.核心思路来了
1001001 1 0
1001002 2 0
1001003 3 0
1001007 4 3
1001008 5 3group by rn-发票号 取max min代码未经测试,懒得建表导数据,思路告诉你了,请给分!多谢
(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