2012-03-09 8 views
1

私は次の出力を生成するクエリを持っている:既存の列の1行目を2行目の新しい列に挿入するにはどうすればよいですか?

| columnA | 
----------- 
|  5 | 
----------- 
|  2 | 
----------- 
|  3 | 
----------- 
|  4 | 
----------- 

は、私は正確にcolumnAと同じである別の列(それのために名前をつけます - columnB)を生成することができます解決策はありますし、から値を持ちます列Aは下に移動します。以下は期待される出力です:

| columnA | columnB | 
--------------------- 
|  5 |  0 | -> put zero for 1st row 
--------------------- 
|  2 |  5 | -> original value from 1st row of columnA 
--------------------- 
|  3 |  2 | -> original value from 2nd row of columnA 
--------------------- 
|  4 |  3 | -> original value from 3rd row of columnA 
--------------------- 

これは私の質問です。 PL/SQLのIN

+3

sqlが順序付けされていませんあなたはどこかにidが入っていると思いますか?行の順序はどうやって分かりますか? – dice

+0

RowIndex.Iを試してください。 – joshua

+0

最初の行が5の場合、クエリには既にフィルタが適用されています。私の悪い記述については申し訳ありません。 – huahsin68

答えて

2

-- this gets just the first line 
select A A1, null A2 from 
    (select A from TABLE) 
where rownum = 1 
union all 
-- this gets the rest of the lines 
select Q1.A A1, Q2.A A2 from 
    (select A, rownum RN from (select A from TABLE)) Q1  
    join 
    (select A, rownum RN from (select A from TABLE)) Q2 
    on Q1.RN = Q2.RN + 1 

は(表からAを選択する)元のリストを提供し、内側のクエリです。テストし、あなたが望むことをします。おそらく何度も何度も表示されるクエリのエイリアスが必要ですが、私は頭の上からそれをどうやって行うのか分かりません。

あなたが元のクエリを変更する気にしない場合にも、

(select A, rownum RN from TABLE)) 

(select A, rownum RN from (select A from TABLE)) 

を置き換えることができます。 Transact SQLで

1

:オリジナルcolumnAを生成するクエリの

 WITH main AS (SELECT ROW_NUMBER() OVER (ORDER BY ColumnA ASC) as rownum, 
          ColumnA 
         FROM MainQuery) 

    SELECT ISNULL(parent.ColumnA,0) as ColumnA, 
      ISNULL(child.ColumnA,0) as ColumnB 
     FROM main parent FULL OUTER JOIN main child 
     ON parent.rownum = child.rownum + 1 

代替 "MainQuery"。

これは、2つの列が重ならない(すなわち、最初の行と最後の行)ゼロを生成します。ダイスとMark Ba​​nnisterが述べたように、列の位置は何らかの順序なしに無意味です。これはキャプチャされます

ROW_NUMBER() OVER (ORDER BY ColumnA ASC) 

どのようにデータを並べ替える必要がありますかを変更する必要があります。

関連する問題