0

我在 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

但我想找到一种更有效的方法。谁能建议怎么做?

4

2 回答 2

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 子句中。

于 2010-06-21T15:30:15.930 回答
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'
于 2010-06-21T15:32:09.307 回答