oracle在线急等

xiaoqinD 2012-11-27 02:45:08
id gm
1 111
2 111
3 111
4 222
5 222
6 333
我要的结果是
gm count(gm) id id2 id3 .....idxn (未知个数)
111 3 1 2 3
222 2 4 5 NULL.....NULL
333 1 6
XXX N N1 N2 N3 ......NN
...全文
191 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
善若止水 2012-12-15
  • 打赏
  • 举报
回复
高手,学习了
yinan9 2012-11-27
  • 打赏
  • 举报
回复
引用 3 楼 yinan9 的回复:
为了达到动态效果,可以创一个存储过程来创建一个视图,当数据更新,执行过程来刷新视图数据 SQL code?12345678910111213141516171819202122232425262728--创建过程create or replace procedure normalize AUTHID CURRENT_USER ismax_id_num number;sq……
SQL> select * from v_test; GM CNT ID1 ID2 ID3 ID4 --- ---------- ---------- ---------- ---------- ---------- 111 4 1 2 3 7 222 2 5 4 333 1 6 SQL> 没有异常处理,写的比简单,楼主按照实际情况修改下
yinan9 2012-11-27
  • 打赏
  • 举报
回复
为了达到动态效果,可以创一个存储过程来创建一个视图,当数据更新,执行过程来刷新视图数据

--创建过程
create or replace procedure normalize AUTHID CURRENT_USER is
max_id_num number;
sqlstr varchar2(2500);
begin
  select max(count(1))into max_id_num  from test group by GM;
  for r in  1..max_id_num loop
    sqlstr:= sqlstr ||','|| 'MAX(CASE rk WHEN ' ||r|| 'THEN id ELSE NULL END) AS ID'||r;
  end loop;
  sqlstr := 'create or replace view v_test as  SELECT gm,count(1) cnt'|| sqlstr || ' FROM (
 SELECT 
 gm,
 ID,
 ROW_NUMBER() OVER(PARTITION BY test.gm ORDER BY gm) rk
 FROM test
 )
 GROUP BY gm ORDER BY gm' ;
 execute  immediate sqlstr;
end normalize;

--执行过程
begin
  normalize;
  end;
--查看结果
select * from v_test;

hfxl1108 2012-11-27
  • 打赏
  • 举报
回复
引用 1 楼 hfxl1108 的回复:
WITH t AS ( SELECT 1 AS ID,'111' AS gm FROM dual UNION SELECT 2 AS ID,'111' AS gm FROM dual UNION SELECT 3 AS ID,'111' AS gm FROM dual UNION SELECT 4 AS ID,'222' AS gm FROM dual UNION SELECT……
失误了,MAX(CASE cc WHEN 3 THEN cc ELSE NULL END) 改成 MAX(CASE cc WHEN 3 THEN id ELSE NULL END) 就ok了
hfxl1108 2012-11-27
  • 打赏
  • 举报
回复
WITH t AS
(
SELECT 1 AS ID,'111' AS gm FROM dual
UNION
SELECT 2 AS ID,'111' AS gm FROM dual
UNION
SELECT 3 AS ID,'111' AS gm FROM dual
UNION
SELECT 4 AS ID,'222' AS gm FROM dual
UNION
SELECT 5 AS ID,'222' AS gm FROM dual
UNION
SELECT 6 AS ID,'333' AS gm FROM dual
)
SELECT
gm,
count(*),
MAX(CASE cc WHEN 1 THEN cc ELSE NULL END) AS ID,
MAX(CASE cc WHEN 2 THEN cc ELSE NULL END) AS ID2,
MAX(CASE cc WHEN 3 THEN cc ELSE NULL END) AS ID3
FROM
(
SELECT
gm,
ID,
ROW_NUMBER() OVER(PARTITION BY t.gm ORDER BY gm) cc
FROM t
)
GROUP BY gm ORDER BY gm;

1 由于ARCHIVE挂起导致数据库挂死 2 NIT文件中SGA区设置太大,导致内存不够用,数据库和系统都挂死 3 由于临时表空间无法扩展导致数据库被挂起 4由于未打补丁导致RMAN备份时将数据库挂起 5由于BLOB类型的表记录数太多操作又太频繁导致数据库效率差 6由于未对特大表(达到或超过100万条记录)定期做表分析导致数据库操作特别慢 7由于空间不够导致插入数据时扩展索引失败 8由于REDOLOG破坏导致数据库异常 9由于控制文件被破坏导致数据库无法正常启动 10由于数据文件丢失或破坏导致数据库无法正常启动 11由于空间参数设置不合理导致扩展表空间、索引等失败 12由于时间格式的环境变量设置问题导致话单无法入库 13由于大事务未使用大回滚段导致事务挂起 14由于数据库连接数太多导致服务器进程数多或内存耗尽 15由于使用了MTS方式,导致数据库操作特别慢(包括备份) 16由于存在一个大事务操作,导致数据库性能特别差或产生频繁日志切换 17由于没有COMMIT,导致数据库表被锁住 18索引创建不合理,导致数据库查询特别慢 19 由于BUFFER参数设置不合理导致EXP失败 20由于EXP不向上兼容,语言不兼容,导致不同版本、不同字符集的数据库无法导入 21 由于创建表空间时误将其创建在以‘本地管理’,导致在表空间上的所有对象无法修改其存储参数 22 错误地在系统表空间上建无关的数据文件 23 ORACLE客户端在P4上安装不成功 24由于LISTENER.ORA或TNSNAMES.ORA配置问题导致网络问题 25由于环境变量设置问题导致VERSOIN版本启动问题 26用户数据、表破坏下的数据恢复 27 由于OS层问题导致数据库ORA-600错误 .....

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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