没用过Oracle求帮助,将sql改为Oracle

gaocumt 2013-08-13 08:32:20
if exists(select 1 from sys.tables where name='test20130507')
drop table test20130507
go
create table test20130507(a varchar(20),b varchar(20),c varchar(20))
insert into test20130507
select '20130508','8:00~9:00','张三' union all
select '20130508','9:00~10:00','测试' union all
select '20130509','8:00~9:00','李四' union all
select '20130509','8:00~9:00','再测' union all
select '20130509','9:00~10:00','再测1' union all
select '20130609','9:00~10:00','再测1'
go

下面一段在Oracle 里面怎么写
declare @sql varchar(max)=''
select @sql=@sql+',max(case when a='''+a+''' then c else null end)as '''+a+''''
from (select distinct a from test20130507)a
exec ('select b'+@sql+'
from (select distinct a,b,
c=stuff((select '',''+c from test20130507 where a.a=a and a.b=b for xml path('''')),1,1,'''')
from test20130507 a)a group by b')
...全文
133 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
soar_angel 2013-08-14
  • 打赏
  • 举报
回复
with aa as ( select '20130508' 日期,'8:00~9:00' 时间,'张三' 姓名 from dual union all select '20130508' 日期,'9:00~10:00' 时间,'测试' 姓名 from dual union all select '20130509' 日期,'8:00~9:00' 时间,'李四' 姓名 from dual union all select '20130509' 日期,'8:00~9:00' 时间,'再测' 姓名 from dual union all select '20130509' 日期,'9:00~10:00' 时间,'再测1' 姓名 from dual union all select '20130609' 日期,'9:00~10:00' 时间,'再测1' 姓名 from dual) select 时间 ,listagg( 姓名,',') within group(order by 时间) from aa group by 时间
soar_angel 2013-08-14
  • 打赏
  • 举报
回复
with aa as ( select '20130508' 日期,'8:00~9:00' 时间,'张三' 姓名 from dual union all select '20130508' 日期,'9:00~10:00' 时间,'测试' 姓名 from dual union all select '20130509' 日期,'8:00~9:00' 时间,'李四' 姓名 from dual union all select '20130509' 日期,'8:00~9:00' 时间,'再测' 姓名 from dual union all select '20130509' 日期,'9:00~10:00' 时间,'再测1' 姓名 from dual union all select '20130609' 日期,'9:00~10:00' 时间,'再测1' 姓名 from dual) select 时间 ,listagg( 姓名,',') within group(order by 时间) from aa group by 时间,姓名
gaocumt 2013-08-14
  • 打赏
  • 举报
回复
人工置顶!求帮助
u010412956 2013-08-14
  • 打赏
  • 举报
回复
行转不定列,, 提供个例子,其他自己对着修改:
7、动态行转不定列
----------------新建测试表
CREATE TABLE tmp_user_2(USER_ID NUMBER,MODE_NAME VARCHAR2(100),TYPE_ID NUmBER);

----------------第一部分测试数据
INSERT INTO tmp_user_2 VALUES(1001, 'M1',1); 
INSERT INTO tmp_user_2 VALUES(1001, 'M2',2);
INSERT INTO tmp_user_2 VALUES(1002, 'M1',3);
INSERT INTO tmp_user_2 VALUES(1002, 'M2',4);
INSERT INTO tmp_user_2 VALUES(1002, 'M3',5);
INSERT INTO tmp_user_2 VALUES(1003, 'M1',6);
COMMIT;

----------------行转列存储过程
CREATE OR REPLACE PROCEDURE P_tmp_user_2 IS
  V_SQL VARCHAR2(2000);
  CURSOR CURSOR_1 IS
    SELECT DISTINCT T.MODE_NAME FROM tmp_user_2 T ORDER BY MODE_NAME;

BEGIN
  V_SQL := 'SELECT USER_ID';
  FOR V_XCLCK IN CURSOR_1 LOOP
    V_SQL := V_SQL || ',' || 'SUM(DECODE(MODE_NAME,''' || V_XCLCK.MODE_NAME ||
             ''',TYPE_ID,0)) AS ' || V_XCLCK.MODE_NAME;
  END LOOP;

  V_SQL := V_SQL || ' FROM tmp_user_2 GROUP BY USER_ID';
  --DBMS_OUTPUT.PUT_LINE(V_SQL);
  V_SQL := 'CREATE OR REPLACE VIEW tmp_user_3  AS ' || V_SQL;
  --DBMS_OUTPUT.PUT_LINE(V_SQL);
  EXECUTE IMMEDIATE V_SQL;
END;

----------------执行存储过程
BEGIN
  P_tmp_user_2;               
END;

----------------查看结果
SELECT * FROM tmp_user_3;

----------------第二部分测试数据
INSERT INTO tmp_user_2 VALUES(1003, 'M2',7); 
INSERT INTO tmp_user_2 VALUES(1004, 'M5',8); 
COMMIT;

----------------执行存储过程
BEGIN
  P_tmp_user_2;               
END;
----------------查看结果
SELECT * FROM tmp_user_3;
soar_angel 2013-08-14
  • 打赏
  • 举报
回复
每一次查找一共有多少列,然后建立一个临时表,然后再往里插数据呢,。。
gaocumt 2013-08-14
  • 打赏
  • 举报
回复
额,就是写在存储过程里面的。动态sql不会改
soar_angel 2013-08-14
  • 打赏
  • 举报
回复
简单的行转列你可以用我提供的方法,如果比较大的数据量,或者考虑性能等因素的话,还是建议写个存储来转换吧,一句话恐怕怎么也完美不了
gaocumt 2013-08-14
  • 打赏
  • 举报
回复
soar_angel:谢谢。 上面数据仅为测试数据,真是数据日期和时间段跨度很大。是不定行列的动态sql。
gaocumt 2013-08-13
  • 打赏
  • 举报
回复
补充:是一个横转纵加合并的问题 如何统计按时间段统计 不同日期的人员,相同日期同一时间段的人员还需要合并显示 时间段 日期1 日期2 日期3 8:00-9:00 张三 李四,再测 XX 9:00-10:00 测试 再测1 10:00-11:00 ....... ..... ....... ......

17,086

社区成员

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

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