2016-05-18 6 views
0

私が思いついた解決策よりも簡単にできると思いました。したがって、私は次のような問題に、よりシンプルなソリューションを持つことが可能であるかどうかを求めています:1つの列を2つの列に入れ替える

次のように私は、単一のカラム形式のデータを持っている:

COLUMN 1 
    ========= 
    partnumber 
    version 
    partnumber 
    version 
    partnumber 
    version 
    etc 

各項目は部品番号で識別され、バージョン。アイテムのバージョンは、そのアイテムの部品番号の直後にあります。しかし、私は次の形式でデータをたいと思います:より良い代替手段はあり

with data as (
select col,rownum+mod(rownum,2) item_index,row_number() over (partition by rownum+mod(rownum,2) order by rownum) colno from(
select -2141 col from dual 
union all 
select 5 col from dual 
union all 
select -2102 col from dual 
union all 
select 2 col from dual 
union all 
select -2021 col from dual 
union all 
select 4 col from dual)) 
select t1.col,t2.col from (select col,item_index from data where colno=1) t1 
join (select col,item_index from data where colno=2) t2 
on t1.item_index=t2.item_index; 


with data as (
select col,rownum rn from (
select -2141 col from dual 
union all 
select 5 col from dual 
union all 
select -2102 col from dual 
union all 
select 2 col from dual 
union all 
select -2021 col from dual 
union all 
select 4 col from dual)) 
select t1.col,t2.col from (select col,rn+mod(rn,2) item_index from data where mod(rn,2)=1) t1 
join (select col,rn+mod(rn,2) item_index from data where mod(rn,2)=0) t2 
on t1.item_index=t2.item_index; 

COLUMN 1 COLUMN 2 
========== ========= 
partnumber version 
partnumber version 
partnumber version 
etc  etc 

私は2つの代替クエリを、次のを思い付きましたの?

+0

「直後」をどのように定義しますか?行が物理的にデータベースに格納される順序に頼っていますか?どんな理由であれ、それが変わったときにあなたは何をしますか? – mathguy

+1

@mathguyの値は、VARRAYに格納されます。 – user2672165

答えて

2

Oracleのセットアップ

CREATE TABLE data(value) AS 
    SELECT 'partnumber' FROM dual UNION ALL 
    SELECT 'version' FROM dual UNION ALL 
    SELECT 'partnumber' FROM dual UNION ALL 
    SELECT 'version' FROM dual UNION ALL 
    SELECT 'partnumber' FROM dual UNION ALL 
    SELECT 'version' FROM dual UNION ALL 
    SELECT 'etc'  FROM dual UNION ALL 
    SELECT 'etc'  FROM dual; 

クエリ

SELECT * 
FROM (
    SELECT value, 
     CEIL(ROWNUM/2) AS id, 
     MOD(ROWNUM, 2) AS isPartNo 
    FROM DATA 
) 
PIVOT(MAX(value) FOR isPartNo IN (1 AS PartNumber, 0 AS Version)) 
ORDER BY id; 

出力

 ID PARTNUMBER VERSION 
---------- ---------- ---------- 
     1 partnumber version  
     2 partnumber version  
     3 partnumber version  
     4 etc  etc   
+0

非常に良い解決策、ただ1つのテーブルへのアクセス。 – Husqvik

+0

優れたソリューション! – user2672165

1

は、これは私には少し単純になります。

WITH data(value) AS (
    SELECT 'partnumber' FROM dual UNION ALL 
    SELECT 'version' FROM dual UNION ALL 
    SELECT 'partnumber' FROM dual UNION ALL 
    SELECT 'version' FROM dual UNION ALL 
    SELECT 'partnumber' FROM dual UNION ALL 
    SELECT 'version' FROM dual UNION ALL 
    SELECT 'etc'  FROM dual UNION ALL 
    SELECT 'etc'  FROM dual), 
seq_data(seq, value) AS (
    SELECT ROWNUM, value FROM data 
) 
SELECT 
    t1.value column1, t2.value column2 
FROM 
    seq_data t1 
    JOIN seq_data t2 ON t1.seq = t2.seq - 1 
WHERE 
    mod(t1.seq, 2) = 1 
関連する問題