2017-04-12 21 views
0

次のクエリをピボットSQLに変換するロジックを取得できないようです。私のテーブルには20個のカラムがあり、それらのカラムを行に変換したいので、エクセルにエクスポートすると20個のカラムで値が同じになるので、1つのカラムでフィルタリングできます。これまでのところ私がやったことは、単一の一つに20列に変換され、その後の行に単一のものということで分割:SQLクエリをピボットに変換する

select  distinct TASKID, 
      regexp_substr(t.roles,'[^|]+', 1, lines.column_value) as role 
from  (
      select TASKID, 
         TRIM(ROLE1) || '|' || 
         TRIM(ROLE2) || '|' || 
         TRIM(ROLE3) || '|' || 
         TRIM(ROLE4) || '|' || 
         TRIM(ROLE5) || '|' || 
         TRIM(ROLE6) || '|' || 
         TRIM(ROLE7) || '|' || 
         TRIM(ROLE8) || '|' || 
         TRIM(ROLE9) || '|' || 
         TRIM(ROLE10) || '|' || 
         TRIM(ROLE11) || '|' || 
         TRIM(ROLE12) || '|' || 
         TRIM(ROLE13) || '|' || 
         TRIM(ROLE14) || '|' || 
         TRIM(ROLE15) || '|' || 
         TRIM(ROLE16) || '|' || 
         TRIM(ROLE17) || '|' || 
         TRIM(ROLE18) || '|' || 
         TRIM(ROLE19) || '|' || 
         TRIM(ROLE20) as roles 
      from  menu_roles 
      where  RLTYPE='58' 
     ) t, 
      TABLE(CAST(MULTISET(select LEVEL from dual connect by instr(t.roles, '|', 1, LEVEL - 1) > 0) as sys.odciNumberList)) lines 
where  regexp_substr(t.roles,'[^|]+', 1, lines.column_value) is not null 
order by regexp_substr(t.roles,'[^|]+', 1, lines.column_value) 

私はPIVOTを使用して文字列を連結し、分割対、より効率的であることを理解したいです。

ありがとうございました!

+0

? 'select taskid、role1 from menu_roles where rltype = '58 'union select taskid、role2 from menu_roles where rltype = '58' union ... ' –

+0

質問にPL/SQLはありません –

+0

@a_horse_with_no_name:どういう意味ですか? – Jaquio

答えて

1

あなたはUNPIVOTをしたいように見える:

SELECT task_id, 
     role 
FROM menu_roles 
UNPIVOT (role FOR role_number IN (ROLE1, ROLE2, ROLE3, ROLE4 /*, ... */)); 

または、UNION ALLを使用:代わりに `UNION`の使用についてどのように

  SELECT task_id, role1 AS role FROM menu_roles 
UNION ALL SELECT task_id, role2 AS role FROM menu_roles 
UNION ALL SELECT task_id, role3 AS role FROM menu_roles 
UNION ALL SELECT task_id, role4 AS role FROM menu_roles 
-- ... 
+0

ありがとう、@ MT0。私が本当に探していたのは、アンピボットでした – Jaquio