行列转换应该怎么写

demonapple 2011-05-11 04:01:17


select
a.bill_sn 工单编号,
c.operate_end_time 操作时间,
(SELECT E.USERNAME
FROM JS_IDA.BAF_ORG_USER E
WHERE E.USERID = c.agentor) 操作人人,
(select t8.objectname
from JS_IDA.BAF_ORG_TREE t8
where t8.objectid=c.agentor_group) 操作人部门,
c.remark 操作备注

from js_ida.t_pub_mainbill_his a,
js_ida.t_open_billinfo_his b,
js_ida.t_pub_bill_action_his c
where a.bill_id=b.bill_id
and a.bill_id=c.bill_id
and a.revert_time>=to_date('2011-04-28','YYYY-MM-DD')
and a.revert_time<(to_date('2011-04-30','YYYY-MM-DD')+1)



我现在用这个语句查下来显示

工单编号 操作时间 操作人人 操作人部门 操作备注

每条工单编号对应可能有几条的操作记录
现在我想把这些操作记录写到一行里面去
前面是工单编号 后面是这个工单编号下面的操作记录
sql应该怎么写?
分不多。。。
...全文
74 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
demonapple 2011-05-12
  • 打赏
  • 举报
回复
sql不是万能的 我还是在程序里面实现吧
tangren 2011-05-11
  • 打赏
  • 举报
回复
下面是一个样例
第一类:如果K_NAME项目固定,使用DEOCDE函数
with test as(
select 3 USER_ID,'背景知识' K_NAME, 4.5 SCORE from dual union all
select 3 USER_ID,'创新能力' K_NAME, 1.5 SCORE from dual union all
select 3 USER_ID,'服务意识' K_NAME, 1 SCORE from dual union all
select 3 USER_ID,'沟通能力' K_NAME, 1 SCORE from dual union all
select 4 USER_ID,'背景知识' K_NAME, 12 SCORE from dual union all
select 4 USER_ID,'创新能力' K_NAME, 1.5 SCORE from dual union all
select 4 USER_ID,'服务意识' K_NAME, 0.5 SCORE from dual union all
select 4 USER_ID,'沟通能力' K_NAME, 0.5 SCORE from dual)
SELECT USER_ID,
SUM(decode(K_NAME, '背景知识', SCORE)) "背景知识",
SUM(decode(K_NAME, '创新能力', SCORE)) "创新能力",
SUM(decode(K_NAME, '服务意识', SCORE)) "服务意识",
SUM(decode(K_NAME, '沟通能力', SCORE)) "沟通能力"
FROM test
GROUP BY USER_ID;


第二类:如果项数不固定,使用存储过程动态SQL拼接
表结构如下:
t_fl:
lb
----
a
b
c
d
e

t_sj
id lb sl
-------------
1 a 10
1 c 30
1 d 40
1 e 50
2 b 20
2 e 50

想弄出这样一个结果:
id sl_a sl_b sl_c sl_d sl_e
---------------------------------
1 10 30 40 50
2 20 50

--1、如果t_fl表行数据不定的话可以写一个存储过程
CREATE OR REPLACE PROCEDURE row2col(o OUT SYS_REFCURSOR) IS
sqlstr VARCHAR2(4000) := '';
BEGIN
FOR cc IN (SELECT lb FROM t_fl) LOOP
sqlstr := sqlstr || 'sum(decode(lb,''' || cc.lb ||''',sl)) as "sl_'
|| cc.lb || '",';
END LOOP;
sqlstr := 'select id,' || rtrim(sqlstr,',') || ' from t_sj group by id';
OPEN o FOR sqlstr;
END row2col;

tangren 2011-05-11
  • 打赏
  • 举报
回复
不定行转列需要写一个动态SQL拼接

3,491

社区成员

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

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