2013-03-21 103 views
1

有什麼方法可以根據值對錶(或查詢)中的列重新排序。根據值對列重新排序

例如,在每一行上,FacName應該是第一個,NPI - 第2個,TIN - 第3個和地址 - 第4個。

謝謝!

enter image description here

回答

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>>) 
+0

首先,非常感謝你!!!!我完全同意,這是一個可怕的設置,但這不是真正的數據,這些是列標題。這是一個自動化的一步,我試圖讓所有可能的字段組合,然後使插入查詢出來。但你是對的,這是一個混亂,我只是不能想出更好的方式 – lalachka 2013-03-21 19:03:52

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 

fiddle

+0

спасибо)))))但我選擇了答案之前,我看到你的,所以我upvoted你的。這可以嗎? – lalachka 2013-03-21 19:38:26

+0

@lalachka - 是的,ктопервый - тотипапа)))沒關係,沒關係。樂意效勞。並感謝有趣的問題。 – 2013-03-21 20:15:40

+0

порадовал,спасибо)))))))))) – lalachka 2013-03-21 23:58:04