这个SQL语句怎么写,请高手帮忙,高分相谢

sixi_fish 2003-08-26 10:15:35
表 rbt
字段 Rbt_counter int(11) 点击次数
Rbt_name char(50) 名字
Rbt_id int(6) ID值
求出其它字段的同时也求到n_arrange值
当Rbt_counter值为rbt表中
前100位时,n_arrange = 5,
前200位时,n_arrange = 4,
前300位时,n_arrange = 3,
前400位时,n_arrange = 2,
前500位时,n_arrange = 1,
请问这个sql语句该怎么写
...全文
33 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sixi_fish 2003-08-28
  • 打赏
  • 举报
回复
jiezhi(浪子)

如果后面的关系不是均匀递增的,这个东西怎么写,比如
1-50:n_arrange = 5
51-120:n_arrange = 4
121-250:n_arrange = 3
251-500:n_arrange = 2
501以下:n_arrange = 1

因为我的库在mysql中,所以没法写存储过程,请问这个语句该怎么写

sixi_fish 2003-08-28
  • 打赏
  • 举报
回复
超过500的返回0
罗海雄 2003-08-26
  • 打赏
  • 举报
回复
what about :
select (5-rownum/100) n_arrange,* from (select * from rbt order by Rbt_counter )
pegtop 2003-08-26
  • 打赏
  • 举报
回复
还有一种情况楼主未讲明,超过500的怎样?为0,还是可为负?

那样,在jiezhi(浪子)的基础上稍改一下!
lbl20020123 2003-08-26
  • 打赏
  • 举报
回复
这类问题根本就不是一个sql语句就能解决得了的,因为对每一行结果都需要一个分析计算的过程。
可以用pl/sql解决。
创建表:
create table RBT
(
RBT_ID NUMBER(6) primary key,
RBT_COUNTER NUMBER(11) not null,
RBT_NAME VARCHAR2(50)
)
/
创建索引
create sequence RBT_SEQ
minvalue 0
maxvalue 999999
start with 1020
increment by 1
cache 20;
用一个匿名块插入所需测试数据:
BEGIN
FOR v_num IN 0..501 LOOP
INSERT INTO rbt
VALUES(rbt_seq.nextval, 501-v_num, 'name' || lpad(rbt_seq.nextval, 6, '0'));
END LOOP;

commit;
DBMS_OUTPUT.PUT_LINE('insert into rbt ' || 501 || ' records successfully!');

EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/

创建用于查询的存储过程:
CREATE OR REPLACE PROCEDURE QUERY_RBT
AS
DECLARE
v_count binary_integer;
v_range binary_integer;
v_rbt RBT%rowtype;

CURSOR CUR_RBT IS
SELECT RBT_ID,RBT_COUNTER,RBT_NAME
FROM RBT;
BEGIN
OPEN CUR_RBT;
FETCH CUR_RBT INTO v_rbt;

IF (SQL%FOUND) THEN
DBMS_OUTPUT.PUT_LINE('RBT_ID ' || 'RBT_COUNTER ' || 'RBT_NAME ' || 'n_arrange');
ELSE
DBMS_OUTPUT.PUT_LINE('record of table doesn''t exist!');
END IF;
WHEN SQL%FOUND DO LOOP
SELECT COUNT(*)
INTO v_count
FROM RBT
WHERE RBT_COUNTER > v_rbt.RBT_COUNTER;

IF (v_count < 100) THEN
v_range := 5;
ELSIF (v_count < 200) THEN
v_range := 4;
ELSIF (v_count < 300) THEN
v_range := 3;
ELSIF (v_count < 400) THEN
v_range := 2;
ELSE
v_range := 1;
END IF;

DBMS_OUTPUT.PUT_LINE(v_rbt.RBT_ID || ' ' || v_rbt.RBT_COUNTER || ' ' || v_rbt.RBT_NAME || ' ' || v_range);

FETCH CUR_RBT INTO v_rbt;
END LOOP;

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(sqlcode || ',' || sqlerrm);
RAISE;
END QUERY_RBT;
/
接下来运行测试:
SQL>set serveroutput on size 10000000
SQL>exec query_rbt;
下面的结果略去。
jiezhi 2003-08-26
  • 打赏
  • 举报
回复
select (5-trunc(rownum/100)) n_arrange,a.* from
(select * from rbt order by Rbt_counter)a
jiezhi 2003-08-26
  • 打赏
  • 举报
回复
select (5-trunc(rownum/100)) n_arrange,a.* from
(select * from rbt order by Rbt_counter)a
LGQDUCKY 2003-08-26
  • 打赏
  • 举报
回复
写一个过程还方便,容易解决。

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧