我有两个表T1和T2。
T1->包含主要数据
T2->配置表
T1:
FILE | ATTRB1 | ATTRB2 | ATTRB3 | ATTRB4 |
F1 | 0 | 2 | 4 | 6 |
F1 | 1 | 3 | 5 | 7 |
F2 | 7 | 8 | 9 | 0 |
F2 | 1 | 2 | 3 | 4 |
F3 | 0 | 2 | 0 | 4 |
F3 | 1 | 0 | 3 | 0 |
F4 | 3 | 6 | 9 | 0 |
F4 | 4 | 8 | 1 | 2 |
T2:
ATTRB_ID | ATTRB_NAME | COLUMN | TABLE_REF |
1 | WORDS | ATTRB1 | T1 |
2 | CHARS | ATTRB2 | T1 |
3 | MATCH | ATTRB3 | T1 |
4 | SPACES | ATTRB4 | T1 |
注意:T1和T2之间的映射使用COLUMN属性和TABLE_REF。如果TABLE_REF是T1,则其中的记录将引用T1。
结果表:
FILE | WORDS | CHARS | MATCH | SPACES |
F1 | 0 | 2 | 4 | 6 |
F1 | 1 | 3 | 5 | 7 |
F2 | 7 | 8 | 9 | 0 |
F2 | 1 | 2 | 3 | 4 |
F3 | 0 | 2 | 0 | 4 |
F3 | 1 | 0 | 3 | 0 |
F4 | 3 | 6 | 9 | 0 |
F4 | 4 | 8 | 1 | 2 |
我们如何使用oracle SQL达到以上结果?
任何有关此主题的帮助都将受到赞赏。
答案 0 :(得分:1)
取消取消T1
中的数据,与T2
合并,再次进行透视:
select *
from (
select rn, file_, val, attrb_name
from (select * from (select rownum rn, t1.* from t1)
unpivot (val for attr in (ATTRB1, ATTRB2, ATTRB3, ATTRB4))) t1
left join t2 on t2.col = t1.attr)
pivot (max(val) for attrb_name in ('WORDS', 'CHARS', 'MATCH', 'SPACES'))
order by rn
答案 1 :(得分:0)
您可以创建一个返回游标的函数
create or replace function query2 (p_table varchar2)
return sys_refcursor
is
rf_cur sys_refcursor;
sql_stm varchar2(4000);
begin
select 'SELECT ' || listagg('"'||column_name||'"' || nvl2(attrb_name,' as "'||attrb_name||'"',''),',') within group (order by column_id) ||' FROM '||p_table into sql_stm
from user_tab_columns
left join t2 on column_name = "COLUMN"
where table_name = p_table;
dbms_output.put_line(sql_stm);
open rf_cur for sql_stm;
return rf_cur;
end query2;
用法:select query2('T1') from dual;