基于搜索字符串旋转列的值

时间:2011-06-16 15:33:55

标签: sql oracle pivot-table

注意:我想在一个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

我该怎么做呢?它就像一个数据透视表,但我试图在列中旋转数据,而不是在表格中旋转列。

请注意,在实际应用程序中,我实际上并不知道String列的值是什么;我只知道值之间的分隔是'〜'

1 个答案:

答案 0 :(得分: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&lt; 20”调整为“LEVEL&lt; your_max_items”来调整搜索字符串中的最大项目数。