产品库中有五个字段和若干记录(你甭管记录的真实性)
产品标识   产品名       竞价开始时间   竞价结束时间   竞价价格      更新时间
1         海尔电脑      2005-9-8       2005-9-18        10         2005-9-4
2         戴尔电脑      2005-9-14      2005-9-24        15         2005-9-5
3         方正电脑      2005-9-5       2005-9-10         8         2005-9-6
4         清华同方      2005-9-7       2005-9-17         11        2005-9-7
5         七喜电脑                                       0         2005-9-8
6         TCL电脑                                        0         2005-9-4
7         神舟电脑                                       0         2005-9-5
8         长城电脑                                       0         2005-9-9
9         联想电脑                                       0         2005-9-6
下面是我要的功能:
假定今天是2005-9-11日,以上产品的排名规则是这样的:
(1)若该产品有竞价,则以竞价的价格来排序(竞价的价格是以天来算的,如10,表示一天的竞价价格为10)
(2)若该产品有竞价,如果当前的日期落在竞价开始时间和竞价结束时间之间,则该条产品的今日竞价是有效的,否则该条竞价产品,当作没有竞价来处理.如上述记录中的第3条方正电脑产品,就已经是过期的竞价
(3)没有竞价的产品或者竞价产品排完之后,余下的则按更新时间来排序,更新时间越前的,排的越前.
以上功能,可不可以用一条SQL语句来实现?如果不能,怎么样来实现??请大侠们给个思路.谢谢了.有思路的,可加我MSN:[email protected].要报酬的,请来洽谈

解决方案 »

  1.   

    --  have a try.我改成英文字段名称了.你自己对应吧.select *
    from t
    order by case when date '2005-09-11' between pro_date1 and pro_date2 then pro_price*(pro_date2-pro_date1)
                  else 0 end desc,pro_uptime desc
      

  2.   

    select * from (
      select * 
      from tab_a
      where 竞价价格>0
      order by 竞价价格
    )
    union all
    select * from
    (
      select * from tab_a
      where 竞价价格>0 and 更新时间 between 竞价开始时间 and 竞价结束时间
      order by 竞价价格
    )
    union all
    select * from 
    (
      select * 
      from tab_a
      where nvl(竞价价格,0)=0
      order by 更新时间 desc
    )