1

値に基づいてテーブル (またはクエリ) の列を並べ替える方法はありますか?

たとえば、すべての行で、FacName を 1 番目、NPI を 2 番目、TIN を 3 番目、住所を 4 番目にする必要があります。

ありがとう!

ここに画像の説明を入力

4

2 に答える 2

2
select col1, col2, col3, col4 from (
  select * from (
    select 
      n, str, row_number() over (partition by n order by 
      decode(substr(str,1,3),'Fac',1,'NPI',2,'TIN',3,'Add',4)) cn 
    from (
      select * from (select t.*, rownum n from t)
      unpivot (str for cn in (col1 as 0, col2 as 0, col3 as 0, col4 as 0))
    )
  )
  pivot (min(str) for cn in (1 as col1, 2 as col2, 3 as col3, 4 as col4))
)
order by n

フィドル

于 2013-03-21T18:53:38.397 に答える
0

列間でデータを移動したいという事実は、基になるデータ モデルが壊れており、正規化する必要があることを強く示唆しています。システムに別の複雑なレイヤーを追加するよりも、データ モデルを修正する方がはるかに適切です。

そうは言っても、次のようなことができるはずです

SELECT (CASE WHEN column1 LIKE 'FacilityName%' THEN column1
             WHEN column2 LIKE 'FacilityName%' THEN column2
             WHEN column3 LIKE 'FacilityName%' THEN column3
             WHEN column4 LIKE 'FacilityName%' THEN column4
             ELSE null
         END) column1,
       (CASE WHEN column1 LIKE 'NPI%' THEN column1
             WHEN column2 LIKE 'NPI%' THEN column2
             WHEN column3 LIKE 'NPI%' THEN column3
             WHEN column4 LIKE 'NPI%' THEN column4
             ELSE null
         END) column2,
       (CASE WHEN column1 LIKE 'TIN%' THEN column1
             WHEN column2 LIKE 'TIN%' THEN column2
             WHEN column3 LIKE 'TIN%' THEN column3
             WHEN column4 LIKE 'TIN%' THEN column4
             ELSE null
         END) column3,
       (CASE WHEN column1 LIKE 'Address%' THEN column1
             WHEN column2 LIKE 'Address%' THEN column2
             WHEN column3 LIKE 'Address%' THEN column3
             WHEN column4 LIKE 'Address%' THEN column4
             ELSE null
         END) column4
  FROM( <<your query>> )
于 2013-03-21T18:46:10.197 に答える