我在Oracle 10g中有一个表,其中包含以下信息:
SQL> select * from t_test;
INFO CODIGO GRUPO
---------- ---------- ----------
101 190 VTOS
100 130 VTOS
102 140 VTOS
我想提取所有具有GRUPO ='VTOS'的行并将这些行转换为列。 CODIGO中的值是预先确定的(我知道哪些值可以存储在该列中),所以希望得到这样的结果:
INFO_190 INFO_130 INFO_140
-------- -------- --------
101 100 102
我知道我可以用一些子查询来做,例如:
SELECT (SELECT info
FROM t_test
WHERE codigo = 190 AND grupo = 'VTOS') info_190,
(SELECT info
FROM t_test
WHERE codigo = 130 AND grupo = 'VTOS') info_130,
(SELECT info
FROM t_test
WHERE codigo = 140 AND grupo = 'VTOS') info_140
FROM DUAL
但我想找到一种更有效的方法。谁能建议怎么做?
答案 0 :(得分:1)
假设您的codigo值相对较少,则以下内容应该有效:
select max(decode(codigo, 190, info, '')) info_190,
max(decode(codigo, 130, info, '')) info_130,
max(decode(codigo, 140, info, '')) info_140
from t_test
where grupo = 'VTOS';
如果您有多个grupo值,请按grupo分组并将其包含在您的select子句中。
答案 1 :(得分:0)
试试这个..
select case CODIGO when 190 then INFO end AS INFO_190,
case CODIGO when 130 then INFO end AS INFO_130,
case CODIGO when 140 then INFO end AS INFO_140
from t_test where grupo = 'VTOS'