首页 新闻 赞助 找找看

sql 查询组合问题

0
悬赏园豆:20 [已解决问题] 解决于 2014-06-07 00:06

问题描述:

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查询语句实现,或者在自定义函数或储存过程中实现

AndonLi的主页 AndonLi | 初学一级 | 园豆:128
提问于:2014-06-05 14:29
< >
分享
最佳答案
0
/*--判断表是否存在,如果存在则删除
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;
收获园豆:15
邀月 | 高人七级 |园豆:25475 | 2014-06-06 15:46
其他回答(2)
0

你的datetime会变化么?如果只有这两天的话倒是好写呢

刘宏玺 | 园豆:14020 (专家六级) | 2014-06-05 14:51

真实数据库的数据时每天都更新的,这里只是模仿了几条类似的数据,我现在的做法是按照日期来查询,比如说上面的结果:我2014/6/1和2014/6/2各查一次,查询出来的结果集放到C#后台代码进行组合,一条sql还没有想好。

支持(0) 反对(0) AndonLi | 园豆:128 (初学一级) | 2014-06-05 15:32
0

你这样的查询结果效果可能是要你在界面上下点功夫,但是你要的查询结果,可以这样写SQL

SELECT typeName,number,datetime 
  FROM Table1
ORDER BY datetime ASC,typename DESC  

这样,你的查询结果就是按照日期升序排列,根据你的typeName可以看出是按降序的,所以这条语句可以达到你要的结果,但是你的什么2014/6/1放在查询结果上面,这是不能实现的,在界面上改改就好了

 

--希望对你有用

收获园豆:5
LgV5 | 园豆:221 (菜鸟二级) | 2014-06-05 15:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册