2011-06-16 82 views
3

注意:我想在單個SQL語句中執行此操作。不PL/SQL,光標循環等基於搜索字符串的列的數據透視值

我有看起來像這樣的數據:

ID String 
-- ------ 
01 2~3~1~4 
02 0~3~4~6 
03 1~4~5~1 

我想提供以某種方式樞轉String列到不同的行,例如的值的報告:

Value "Total number in table" 
----- ----------------------- 
1  3 
2  1 
3  2 
4  3 
5  1 
6  1 

我該如何去做這件事?它就像一個數據透視表,但我試圖將數據轉移到列中,而不是旋轉表中的列。

請注意,在實際應用中,我實際上並不知道字符串列的值是什麼;我只知道值之間的分離是 '〜'

+0

[將列拆分爲多行]的可能重複(http://stackoverflow.com/questions/3713107/split-column-to-multiple-rows) – 2011-06-16 15:45:21

回答

2

鑑於本次測試數據:

CREATE TABLE tt (ID INTEGER, VALUE VARCHAR2(100)); 
INSERT INTO tt VALUES (1,'2~3~1~4'); 
INSERT INTO tt VALUES (2,'0~3~4~6'); 
INSERT INTO tt VALUES (3,'1~4~5~1'); 

這個查詢:

SELECT VALUE, COUNT(*) "Total number in table" 
    FROM (SELECT tt.ID, SUBSTR(qq.value, sp, ep-sp) VALUE 
      FROM (SELECT id, value 
        , INSTR('~'||value, '~', 1, L) sp -- 1st posn of substr at this level 
        , INSTR(value||'~', '~', 1, L) ep -- posn of delimiter at this level 
        FROM tt JOIN (SELECT LEVEL L FROM dual CONNECT BY LEVEL < 20) q -- 20 is max #substrings 
          ON LENGTH(value)-LENGTH(REPLACE(value,'~'))+1 >= L 
       ) qq JOIN tt on qq.id = tt.id) 
GROUP BY VALUE 
ORDER BY VALUE; 

結果:

VALUE  Total number in table 
---------- --------------------- 
0        1 
1        3 
2        1 
3        2 
4        3 
5        1 
6        1 

7 rows selected 

SQL> 

你可以通過將「LEVEL < 20」調整爲「LEVEL」來調整搜索字符串中的最大項目數your_max_items「。

相關問題