注意:我想在一个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列的值是什么;我只知道值之间的分隔是'〜'
答案 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”来调整搜索字符串中的最大项目数。