当前位置:编程学习 > JAVA >>

oracle求一个sql 困住了

   是这样的  我要查询一个表的数据 比如表a 页面上有个start_time 和end_time 我要显示两种数据,一个是在时间范围内的数据 一个是历史数据。
   当然我要的不是全部,历史数据我要的是某一个字段的最大值 是要分组的 
   比如查询a表max(number)字段的最大值 我选start_time 是5月 end_time是9月 显示当前最大的number数据是5月到9月的要求分组,但是选择后我还要在页面上显示历史的 就是小于5月的 要列出 4月number的最大值 3月最大值
 这个sql是为了明白简化的 目前我的sql写成大概是这样 
select 月份,max(number) 当前number ,(select max(number) from a where 月份<start_time) 历史number from a where 月份>=start_time and 月份 group by月份  
这样出的结果就是历史number是历史数据的最大值 没分组 分了半天也没分明白 求高人 --------------------编程问答-------------------- 我很认真的看了,确实没怎么看明白你要什么。。。。 --------------------编程问答-------------------- 我看了2遍  没看懂~ --------------------编程问答-------------------- 能不能把你的问题举个例子比如表中的内容有什么,最终结果是要什么,我也没看明白你要做什么 --------------------编程问答-------------------- 建议你放在两个SQL里面解决,页面传递的时候分别传递对应的List或者doulbe MAX NUM --------------------编程问答-------------------- 不太明白,比方有个销量表,里面有 月份,商品,销量
大致好像是这样:比方是查询选定月份的销量最大的是哪种商品,然后还有历史的销量,当然都是求最大销量的商品。
月份 销量 商品
1    100    a
1    20     b
2    10     。
3    140    。
4    130    。
5    19
6    180 --------------------编程问答-------------------- 附上原sql吧  表述能力有限 - -
select p.site  ||'-link'|| p.perf_key ctilinknumber,max(p.perf_avg_value) svalue, max(p.perf_max_value) rvalue,
 max(p.perf_min_value) period,wm_concat(p.perf_max_value_date) maxvalueDate 
 from report_day_info p 
 where perf_group='ctiLink'  and trunc(p.report_date)>=to_date('2012-09-17','yyyy/MM/dd') and trunc(p.report_date)<=to_date('2012-09-19','yyyy/MM/dd')
 and p.perf_max_value in(select max(p.perf_max_value) rvalue 
 from report_day_info p 
 where 
   trunc(p.report_date)>=to_date('2012-09-17','yyyy/MM/dd') and trunc(p.report_date)<=to_date('2012-09-19','yyyy/MM/dd') and
   p.perf_group = 'ctiLink' and p.perf_max_value !=0 group by p.site,p.perf_key ) 
  and  p.perf_max_value !=0  and perf_key!='AS8720'and perf_key!='BS8720'
 group by p.site,p.perf_key order by ctilinknumber
这里面才查出来的max(p.perf_max_value) rvalue 是符合条件trunc(p.report_date)>=to_date('2012-09-17','yyyy/MM/dd') and trunc(p.report_date)<=to_date('2012-09-19','yyyy/MM/dd')的
我还想要一个max(p.perf_max_value) his_rvalue条件是trunc(p.report_date)<to_date('2012-09-17','yyyy/MM/dd')的 也需要group by p.site,p.perf_key order by ctilinknumber --------------------编程问答-------------------- 为什么不用 2个或者 3个SQL语句解决呢? --------------------编程问答-------------------- 我也想用2个 但是这个不是在java代码里,是在快逸报表里面,只可以修改sql   直接写2个sql就不执行了,然后。。。。就没然后了 不知道咋写  没啥头绪- - --------------------编程问答-------------------- 建议你描述下你的业务需求,不要用sql来描述,你这样描述我真看不懂。
这类问题,我应该是能帮你解决,但你得让我懂你要什么。 --------------------编程问答-------------------- 那你只能调用一个SQL的话,只能写存储过程了 --------------------编程问答-------------------- 不知道再说啥东西,表达清晰一点 --------------------编程问答--------------------
引用 9 楼  的回复:
建议你描述下你的业务需求,不要用sql来描述,你这样描述我真看不懂。
这类问题,我应该是能帮你解决,但你得让我懂你要什么。

那我就细说一下  一个表 a 里面有data  start_time  end_time month 4个字段 原本的sql是查询出 在时间范围内 start_time到end_time内的 所有data 的最大值  比如start_time 是4月 end_time是10月 根据month分组  那么查询的data最大值就是 4月的max 5月。。。。10月max ,现在要多查询一个 就是历史data的最大值也是根据month分组  想要的到的结果是这样 比如start_time 是4月 end_time是10月不仅要得出刚才说的结果 还要 4月以前的  比如 3月的max(data) 2月的。。。1月的 
一句话就是原来的sql只是查询出来用户选定的范围内的数据  现在要多增加一个 根据用户选定的开始时间给出以前的数据  分组信息不变 --------------------编程问答-------------------- 按你的说法,我怎么感觉限定start_time和end_time没有什么意义。还不如全部查出来 --------------------编程问答-------------------- 我的理解,是不是查出end_time是10月前的数据并按照年月、商品分组就可以了。 --------------------编程问答-------------------- 润乾快逸报表里面是存在子报表的,你可以根据多个数据来源而引进多个子报表,一个子报表对应一个SQL --------------------编程问答--------------------
引用 14 楼  的回复:
我的理解,是不是查出end_time是10月前的数据并按照年月、商品分组就可以了。


我觉得楼主想要的就是当前年份(start_time 所在年份) 至 选定的 end_time 时间内的数据,跟start_time无关了。


SELECT p.site
         || '-link'
         || p.perf_key                   ctilinknumber,
        Max(p.perf_avg_value)            svalue,
        Max(p.perf_max_value)            rvalue,
        Max(p.perf_min_value)            period,
        Wm_concat(p.perf_max_value_date) maxvalueDate
 FROM   report_day_info p
 WHERE  perf_group = 'ctiLink'
        AND Trunc(p.report_date) >= To_date('2012-01-01', 'yyyy/MM/dd')--这里改为1月1日
        AND Trunc(p.report_date) <= To_date('2012-09-19', 'yyyy/MM/dd')
        AND p.perf_max_value IN(SELECT Max(p.perf_max_value) rvalue
                                FROM   report_day_info p
                                WHERE  Trunc(p.report_date) >= To_date('2012-01-01', 'yyyy/MM/dd')--这里改为1月1日
                                       AND Trunc(p.report_date) <= To_date('2012-09-19', 'yyyy/MM/dd')
                                       AND p.perf_group = 'ctiLink'
                                       AND p.perf_max_value != 0
                                GROUP  BY p.site,
                                          p.perf_key)
        AND p.perf_max_value != 0
        AND perf_key != 'AS8720'
        AND perf_key != 'BS8720'
 GROUP  BY p.site,
           p.perf_key
 ORDER  BY ctilinknumber 
 
--------------------编程问答-------------------- 方法一:按月份嵌入多个子报表,在主报表中列表多月份,然后单元扩展出多子报表,将月份传入子报表,然后子报表就只针对固定月份的销量最多的统计,这个不用说你也会的
方法二:如果实在想一个SQL语句搞定,可以参照:
select * from product aaa,
(select max(number),productid,monthY from product from 
(select productid,month(end_time) as monthY,number from product 
group by MONTH(end_time),productid)
abc group by monthY) bbb where aaa.productid = bbb.productid and aaa.end_time between (bb.monthY+'-01') and (bb.monthY+'月末')

其中字段,表名都是我虚拟的,SQL的语法格式是mysql,可以调整后尝试下 --------------------编程问答-------------------- 额的神呐,楼上SQL又是in又是表嵌套表,这个SQL执行效率不敢恭维啊。
貌似楼主跟帖不积极。 --------------------编程问答-------------------- 在忙啊 呵呵,这个sql却是效率不咋地  反正我是改 就这样吧 --------------------编程问答--------------------
引用 13 楼  的回复:
按你的说法,我怎么感觉限定start_time和end_time没有什么意义。还不如全部查出来

我是给别人改的  乾坤报表我没用过  我开始说的是全查出来 在jsp里去分  可是 jsp貌似是报表的jar里生成的 - - --------------------编程问答--------------------
引用 15 楼  的回复:
润乾快逸报表里面是存在子报表的,你可以根据多个数据来源而引进多个子报表,一个子报表对应一个SQL

哦  不太明白 我好好看看去 
--------------------编程问答-------------------- 数据库搞了这么长时间,仔细的看了一遍,完全看不懂是什么意思。 --------------------编程问答-------------------- 我的理解能力确实存在问题。而楼上居然搞懂了楼主的意思,还把SQL搞出来了,我汗颜。。。 --------------------编程问答-------------------- j2ee,ssh,oracle...二十余个java内部项目视频,少年,要相信项目改变命运,Q1583539597 --------------------编程问答-------------------- 项目过程中碰到类似的问题。多个子报表是可行的,一个sql也是可行的,但是数据量大的话都有效率问题。貌似可以在数据库中弄个视图做信息中转。
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,