oracle是否有这样的函数

xhh_88 2010-05-29 09:24:07
数据表如下:

产品名称 2月销量排名 1月销量 2月销量 3月销量 4月销量 5月销量 6月销量 7月销量 8月销量... 12月销量


有没有函数能将第二字段(2月销量排名)的值求出来,【2月销量排名】是2月在一年12个月中的销量排名
...全文
198 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
tangren 2010-05-30
  • 打赏
  • 举报
回复
1、没有这样的函数
2、你的原始数据应该是纵表吧,如果是这样,先在原始数据上排名,然后转横表
3、如果原数据如你举列的横表,写一个自定义函数
wh62592855 2010-05-30
  • 打赏
  • 举报
回复
SQL> select * from tSaleCount t;

PRODUCT_NAME JAN FEB MAR
-------------------- ---------- ---------- ----------
A 100 200 300
B 500 400 600
C 300 700 200
D 500 400 600

SQL> create or replace function p_rank(p1 number,p2 number,p3 number)
2 return number
3 is
4 rank number;
5 begin
6 select rn into rank
7 from
8 (
9 select quantity,row_number() over(order by quantity desc) rn
10 from
11 (
12 select p1 quantity
13 from dual
14 union all
15 select p2 quantity
16 from dual
17 union all
18 select p3 quantity
19 from dual
20 )
21 )
22 where quantity = p2;
23 return rank;
24 end;
25 /

Function created

SQL> select t.*,p_rank(jan,feb,mar) from tSaleCount t;

PRODUCT_NAME JAN FEB MAR P_RANK(JAN,FEB,MAR)
-------------------- ---------- ---------- ---------- -------------------
A 100 200 300 2
B 500 400 600 3
C 300 700 200 1
D 500 400 600 3

Adebayor 2010-05-29
  • 打赏
  • 举报
回复
--table为表名
--p_mon月份参数 为1月,2月.........12月
--如果lz只是想求出2月的 那就把p_mon写死吧
create or replace function fun(p_mon in varchar2) return number is
Result number;
declare
p_rank number;
begin
select rn into p_rank
from (select mon, rownum rn
from (select mon
from (select '1月' mon, 1月销量 sale
from table
union all
select '2月' mon, 2月销量 sale
from table
union all
select '3月' mon, 3月销量 sale
from table
union all
select '4月' mon, 4月销量 sale
from table
union all
select '5月' mon, 5月销量 sale
from table
union all
select '6月' mon, 6月销量 sale
from table
union all
select '7月' mon, 7月销量 sale
from table
union all
select '8月' mon, 8月销量 sale
from table
union all
select '9月' mon, 9月销量 sale
from table
union all
select '10月' mon, 10月销量 sale
from table
union all
select '11月' mon, 11月销量 sale
from table
union all
select '12月' mon, 12月销量 sale from table)
order by sal desc))
where mon = p_mon;

return p_rank;
end fun;
line_us 2010-05-29
  • 打赏
  • 举报
回复
分类汇总然后排序就得了
Adebayor 2010-05-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xhh_88 的回复:]

函数如果是传13个参数,当月销量,1月销量,2月销量...12月销量,我就能查询出当月的销量排名了,这样根本就不需要再查询那个表了!
[/Quote]
哈哈 你的描述的很形象呀
不过应该只是传入传入3个参数就够了 确切说两个
1个产品名称 另个为系统时间 并且从中获得年份及月份
Adebayor 2010-05-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 adebayor 的回复:]

--table为表名
--p_mon月份参数 为1月,2月.........12月
--如果lz只是想求出2月的 那就把p_mon写死吧
create or replace function fun(p_mon in varchar2) return number is
Result number;
declare
p_rank number;
begin
sele……
[/Quote]
把这种写法的sql改下 通过rank进行排行吧
Adebayor 2010-05-29
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 xhh_88 的回复:]

引用 17 楼 adebayor 的回复:
引用 11 楼 xhh_88 的回复:

引用 9 楼 lzbbob1985 的回复:
横表变纵表 然后 排序 2楼应该没问题的 只是效率问题


横的、纵的我都要排序,所以不能进行行列转换

怎么个横的、纵的都要排序 也没看出来呀?
上面你的结果只是行字段的排序呀



同一个月,不同上面之间的销量排名,也就是纵向排名,数……
[/Quote]
明白了
没有系统函数可以实现的
你可以采用1楼上面的写法 不过要加上group by 按产品名称分组 如果很多年份的话 也要加上年份分组 就可以满足lz的需求

xhh_88 2010-05-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 adebayor 的回复:]
引用 8 楼 xhh_88 的回复:

我要的结果

产品名称 1月销量 2月销量 3月销量 二月销量排行
AA 100 200 300 2 --AA商品1-3月份数据中,2月排名第二
BB 500 400 600 3 --BB商品1-3月份数据中,3月排名第二
CC 300 700 200 1
DD 500 400 600 3

AA 2月销量为200 排名应该为第四吧?
……
[/Quote]
BB中文的二是笔误,应该是三
xhh_88 2010-05-29
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 adebayor 的回复:]
引用 11 楼 xhh_88 的回复:

引用 9 楼 lzbbob1985 的回复:
横表变纵表 然后 排序 2楼应该没问题的 只是效率问题


横的、纵的我都要排序,所以不能进行行列转换

怎么个横的、纵的都要排序 也没看出来呀?
上面你的结果只是行字段的排序呀
[/Quote]


同一个月,不同上面之间的销量排名,也就是纵向排名,数据库有rank()可以实现,所以我没有说出来,我要的是同一个商品,不同月份之间的横向排名,我没有发现数据有什么函数
lzbbob1985 2010-05-29
  • 打赏
  • 举报
回复
改造下 2楼的


with temp as
select 产品名称 row_number() over(partition by 产品名称 order by sale) rn from (
select 产品名称, 2月销量 sale , '1' flag from your_table
union all
select 产品名称, 1月销量, '0' flag from your_table
union all
select 产品名称, 3月销量, '0' flag from your_table
union all
select 产品名称, 4月销量, '0' flag from your_table
union all
select 产品名称, 5月销量, '0' flag from your_table
union all
select 产品名称, 6月销量, '0' flag from your_table
union all
select 产品名称, 7月销量, '0' flag from your_table
union all
select 产品名称, 8月销量, '0' flag from your_table
union all
select 产品名称, 9月销量, '0' flag from your_table
union all
select 产品名称, 10月销量, '0' flag from your_table
union all
select 产品名称, 11月销量, '0' flag from your_table
union all
select 产品名称, 12月销量, '0' flag from your_table
)
where flag = '1'
select a.* ,b.rn 2月排名 from your_table a, temp b
where a.产品名称 = b.产品名称

在家里 没法试验 不知道这样行不行
Adebayor 2010-05-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xhh_88 的回复:]

引用 9 楼 lzbbob1985 的回复:
横表变纵表 然后 排序 2楼应该没问题的 只是效率问题


横的、纵的我都要排序,所以不能进行行列转换
[/Quote]
怎么个横的、纵的都要排序 也没看出来呀?
上面你的结果只是行字段的排序呀
Adebayor 2010-05-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lzbbob1985 的回复:]

他这个2月销量 排名说的是 一条记录中的2月 在这条记录中徘第几
LZ是这个意思吧
[/Quote]
没错 上面我误解了
Adebayor 2010-05-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 adebayor 的回复:]

引用 8 楼 xhh_88 的回复:

我要的结果

产品名称 1月销量 2月销量 3月销量 二月销量排行
AA 100 200 300 2 --AA商品1-3月份数据中,2月排名第二
BB 500 400 600 3 --BB商品1-3月份数据中,3月排名第二
CC 300 700 200 1
DD 500 400 600 3

AA 2月销量为200 排名应该为第四吧?……
[/Quote]
sorry aa 这个2月排名是3个月之间的排名
那bb怎么回事呀?
lzbbob1985 2010-05-29
  • 打赏
  • 举报
回复
他这个2月销量 排名说的是 一条记录中的2月 在这条记录中徘第几
LZ是这个意思吧
Adebayor 2010-05-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xhh_88 的回复:]

我要的结果

产品名称 1月销量 2月销量 3月销量 二月销量排行
AA 100 200 300 2 --AA商品1-3月份数据中,2月排名第二
BB 500 400 600 3 --BB商品1-3月份数据中,3月排名第二
CC 300 700 200 1
DD 500 400 600 3
[/Quote]
AA 2月销量为200 排名应该为第四吧?
BB 怎么出来了3月排名 不是2月的吗?
lzbbob1985 2010-05-29
  • 打赏
  • 举报
回复
表数据量有多大 ?
xhh_88 2010-05-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lzbbob1985 的回复:]
横表变纵表 然后 排序 2楼应该没问题的 只是效率问题
[/Quote]

横的、纵的我都要排序,所以不能进行行列转换
xhh_88 2010-05-29
  • 打赏
  • 举报
回复
看来大家对我的描述还是有异议,那我举个具体的例子吧,为了方面,下面只列举3个月的

tSaleCount表结构

产品名称 1月销量 2月销量 3月销量
--AA--------100-----200-----300
--BB--------500-----400-----600
--CC--------300-----700-----200
--DD--------500-----400-----600

我要的结果

产品名称 1月销量 2月销量 3月销量 二月销量排行
--AA--------100-----200-----300-----2 (AA商品1-3月份数据中,2月排名第2)
--BB--------500-----400-----600-----3 (BB商品1-3月份数据中,3月排名第3)
--CC--------300-----700-----200-----1
--DD--------500-----400-----600-----3
lzbbob1985 2010-05-29
  • 打赏
  • 举报
回复
横表变纵表 然后 排序 2楼应该没问题的 只是效率问题
xhh_88 2010-05-29
  • 打赏
  • 举报
回复
看来大家对我的描述还是有异议,那我举个具体的例子吧,为了方面,下面只列举3个月的

tSaleCount表结构

产品名称 1月销量 2月销量 3月销量
AA 100 200 300
BB 500 400 600
CC 300 700 200
DD 500 400 600

我要的结果

产品名称 1月销量 2月销量 3月销量 二月销量排行
AA 100 200 300 2 --AA商品1-3月份数据中,2月排名第二
BB 500 400 600 3 --BB商品1-3月份数据中,3月排名第二
CC 300 700 200 1
DD 500 400 600 3
加载更多回复(6)
第一篇 Oracle管理配置 第1章 Oracle安装配置(教学视频:10分钟) 23 1.1 Oracle简介 23 1.1.1 数据库术语 23 1.1.2 主流数据库简介 24 1.1.3 Oracle数据库的特点 24 1.2 安装Oracle数据库 25 1.2.1 Oracle数据库的版本变迁及安装环境 25 1.2.2 安装过程 26 1.2.3 安装中需要注意的问题 27 1.3 本章小结 28 1.4 习题 28 第2章 Oracle常用工具(教学视频:7分钟) 29 2.1 Net Configuration Assistant(网络配置助手) 29 2.1.1 监听程序配置 29 2.1.2 命名方法配置 31 2.1.3 本地Net服务名配置 32 2.2 Net Manager(网络管理员) 34 2.3 本章实例 36 2.4 本章小结 38 2.5 习题 38 第3章 SQL Plus和PL/SQL(教学视频:11分钟) 39 3.1 SQL Plus与PL/SQL简介 39 3.2 使用SQL Plus 40 3.2.1 登录SQL Plus 40 3.2.2 SQL Plus输出结果的格式化 41 3.2.3 SQL Plus小结 46 3.3 PL/SQL 46 3.3.1 PL/SQL常用开发工具 46 3.3.2 开发一个简单的PL/SQL程序 48 3.4 本章实例 49 3.5 本章小结 50 3.6 习题 50 第二篇 Oracle数据库对象 第4章 Oralce数据库(教学视频:15分钟) 51 4.1 创建Oracle数据库 51 4.2 Oracle数据库的相关术语 52 4.2.1 数据库 53 4.2.2 数据库实例和SID 53 4.2.3 ORACLE_SID 54 4.3 Oracle数据库的备份与恢复 55 4.3.1 逻辑备份/恢复(导出/导入) 55 4.3.2 物理备份/恢复 56 4.3.3 利用PL/SQL Developer备份数据库 60 4.4 本章实例 61 4.5 本章小结 61 4.6 习题 62 第5章 Oracle数据表对象(教学视频:42分钟) 63 5.1 Oracle表空间 63 5.1.1 Oracle表空间简介 63 5.1.2 创建Oracle表空间 64 5.1.3 查看表空间 66 5.1.4 修改数据库默认表空间 67 5.1.5 修改表空间名称 68 5.1.6 删除表空间 69 5.2 创建Oracle数据表 70 5.2.1 利用工具创建数据表 70 5.2.2 利用工具查看数据表 71 5.2.3 利用命令创建数据表 72 5.2.4 利用命令查看表结构 72 5.3 修改Oracle数据表结构 73 5.3.1 利用工具修改数据表结构 73 5.3.2 利用命令修改数据表结构 74 5.4 删除数据表 75 5.4.1 利用工具删除数据表 76 5.4.2 利用SQL语句删除数据表 76 5.5 备份/恢复数据表 76 5.5.1 利用工具备份/恢复数据表 77 5.5.2 利用命令备份/恢复数据表 82 5.6 临时表 83 5.6.1 临时表简介 83 5.6.2 会话级临时表 84 5.6.3 事务级临时表 85 5.6.4 查看临时表在数据库中的信息 86 5.6.5 临时表的应用场景 86 5.7 特殊的表dual 87 5.7.1 分析dual表 87 5.7.2 dual表的应用场景 87 5.7.3 修改dual表对查询结果的影响 88 5.8 本章实例 89 5.9 本章小结 90 5.10 习题 90 第6章 约束(教学视频:43分钟) 91 6.1 主键约束 91 6.1.1 主键简介 91 6.1.2 创建主键约束 92 6.1.3 修改表的主键约束 94 6.1.4 主键应用场景 96 6.2 外键约束 97 6.2.1 外键简介 97 6.2.2 创建外键约束 97 6.2.3 级联更新与级联删除 100 6.2.4 修改外键属性 102 6.2.5 外键使用 104 6.3 唯一性约束 105 6.3.1 唯一性约束简介 105 6.3.2 创建唯一性约束 105 6.3.3 修改唯一性约束 107 6.3.4 唯一性约束的使用 108 6.4 检查约束 108 6.4.1 检查约束简介 108 6.4.2 创建检查约束 108 6.4.3 修改检查约束 110 6.4.4 检查约束的使用 111 6.5 默认值约束 111 6.5.1 默认值约束简介 112 6.5.2 创建默认值约束 112 6.5.3 修改默认值约束 113 6.6 本章实例 115 6.7 本章小结 116 6.8 习题 116 第7章 视图(教学视频:50分钟) 117 7.1 关系视图 117 7.1.1 建立关系视图 117 7.1.2 修改/删除视图 118 7.1.3 联接视图 120 7.1.4 编译视图 122 7.1.5 使用force选项强制创建视图 124 7.1.6 利用视图更新数据表 125 7.1.7 with check option选项 126 7.1.8 关系视图小结 128 7.2 内嵌视图 128 7.2.1 内嵌视图简介 128 7.2.2 内嵌视图的使用 128 7.2.3 内嵌视图小结 130 7.3 对象视图 131 7.3.1 对象视图简介 131 7.3.2 对象视图简介 131 7.4 物化视图 133 7.4.1 物化视图简介 133 7.4.2 物化视图的使用 133 7.4.3 物化视图的数据加载 135 7.4.4 物化视图的数据更新 135 7.4.5 查询重写 136 7.5 本章小结 136 7.6 本章实例 137 7.7 习题 137 第8章 函数与存储过程(教学视频:48分钟) 138 8.1 函数 138 8.1.1 函数简介 138 8.1.2 创建函数 139 8.1.3 函数中的括号 140 8.1.4 函数的参数 141 8.1.5 函数的确定性 142 8.1.6 典型函数举例 143 8.2 存储过程 144 8.2.1 存储过程简介 144 8.2.2 创建存储过程 144 8.2.3 存储过程的参数——IN参数 146 8.2.4 存储过程的参数——OUT参数 147 8.2.5 存储过程的参数——IN OUT参数 149 8.2.6 存储过程的参数——参数顺序 149 8.2.7 存储过程的参数——参数的默认值 152 8.2.8 存储过程的参数——参数顺序总结 153 8.3 程序包 153 8.3.1 规范 153 8.3.2 主体 155 8.3.3 调用程序包中的函数/存储过程 157 8.3.4 程序包中的变量 158 8.4 本章实例 159 8.5 本章小结 161 8.6 习题 161 …… 第9章 游标(教学视频:36分钟) 162 第10章 触发器(教学视频:58分钟) 178 第11章 序列(教学视频:28分钟) 206 第12章 用户角色与权限控制(教学视频:45分钟) 215 第三篇 Oracle中的SQL 第13章 Oracle数据类型(教学视频:21分钟) 231 第14章 Oracle中的函数与表达式(教学视频:111分钟) 240 第15章 Oracle中的控制语句(教学视频:16分钟) 282 第16章 SQL查询(教学视频:55分钟) 290 第17章 SQL更新数据(教学视频:34分钟) 319 第四篇 Oracle编程高级应用 第18章 数据库速度优化与数据完整性(教学视频:32分钟) 332 第19章 数据一致性与事务管理(教学视频:46分钟) 341 第20章 并发控制(教学视频:35分钟) 356 第21章 Oracle中的正则表达式(教学视频:29分钟) 369 第五篇 Oracle与编程语言综合使用实例 第22章 Oracle在Java开发中的应用(教学视频:38分钟) 376 第23章 Oracle在C#开发中的应用(教学视频:12分钟) 391

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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