问题描述:
datetime typename number classify
2014/6/1 作者1 100 Author
2014/6/1 作者2 200 Author
2014/6/1 作者3 300 Author
2014/6/1 读者1 150 Reader
2014/6/1 读者2 250 Reader
2014/6/1 读者3 350 Reader
2014/6/2 作者1 400 Author
2014/6/2 作者2 300 Author
2014/6/2 作者3 200 Author
2014/6/2 读者1 450 Reader
2014/6/2 读者2 350 Reader
2014/6/2 读者3 250 Reader
想要的结果:
2014/6/1 2014/6/2
typename number typename number
作者3 300 作者1 400
作者2 200 作者2 300
作者1 100 作者3 200
读者3 350 读者1 450
读者2 250 读者2 350
读者1 150 读者3 250
求大牛指导,怎么样用一条oracel sql查询语句实现,或者在自定义函数或储存过程中实现
/*--判断表是否存在,如果存在则删除 declare num number; begin select count(1) into num from all_tables where TABLE_NAME = 'T_Demo20140606' --and OWNER='SCOTT'; if num=1 then execute immediate 'drop table T_Demo20140606'; end if; end; */ --drop table T_Demo20140606; Create table T_Demo20140606 (dt2 date, typename varchar2(100), number2 number(20), classify varchar2(100) ); insert into T_Demo20140606 select to_date('2014/6/1','yyyy/MM/dd'),'作者1',100,'Author' from dual union all select to_date('2014/6/1','yyyy/MM/dd'),'作者2',200,'Author' from dual union all select to_date('2014/6/1','yyyy/MM/dd'),'作者3', 300,'Author' from dual union all select to_date('2014/6/1','yyyy/MM/dd'),'读者1', 150,'Reader' from dual union all select to_date('2014/6/1','yyyy/MM/dd'),'读者2', 250,'Reader' from dual union all select to_date('2014/6/1','yyyy/MM/dd'),'读者3', 350,'Reader' from dual union all select to_date('2014/6/2','yyyy/MM/dd'),'作者1', 400,'Author' from dual union all select to_date('2014/6/2','yyyy/MM/dd'),'作者2', 300,'Author' from dual union all select to_date('2014/6/2','yyyy/MM/dd'),'作者3', 200,'Author' from dual union all select to_date('2014/6/2','yyyy/MM/dd'),'读者1', 450,'Reader' from dual union all select to_date('2014/6/2','yyyy/MM/dd'),'读者2', 350,'Reader' from dual union all select to_date('2014/6/2','yyyy/MM/dd'),'读者3', 250,'Reader' from dual; select * from T_Demo20140606; select typeName,number2 from T_Demo20140606 t group by t.dt2,t.classify,typeName,number2 having to_char(t.dt2,'yyyy/MM/dd')='2014/06/01' order by t.classify,t.number2 desc; /* TYPENAME NUMBER2
1 作者3 300
2 作者2 200
3 作者1 100
4 读者3 350
5 读者2 250
6 读者1 150 */ select t.typeName,t.number2,rank() over(partition by t.classify order by t.classify desc, t.number2 desc) rankno from T_Demo20140606 t where to_char(t.dt2,'yyyy/MM/dd')='2014/06/02' ; /* TYPENAME NUMBER2 RANKNO 1 作者1 400 1 2 作者2 300 2 3 作者3 200 3 4 读者1 450 1 5 读者2 350 2 6 读者3 250 3 */ drop table T_Demo20140606;
你的datetime会变化么?如果只有这两天的话倒是好写呢
真实数据库的数据时每天都更新的,这里只是模仿了几条类似的数据,我现在的做法是按照日期来查询,比如说上面的结果:我2014/6/1和2014/6/2各查一次,查询出来的结果集放到C#后台代码进行组合,一条sql还没有想好。
你这样的查询结果效果可能是要你在界面上下点功夫,但是你要的查询结果,可以这样写SQL
SELECT typeName,number,datetime FROM Table1 ORDER BY datetime ASC,typename DESC
这样,你的查询结果就是按照日期升序排列,根据你的typeName可以看出是按降序的,所以这条语句可以达到你要的结果,但是你的什么2014/6/1放在查询结果上面,这是不能实现的,在界面上改改就好了
--希望对你有用