2011-06-16 86 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“。

相关问题