-1

Oracle 数据库 11g 企业版 11.2.0.2.0 - 64 位生产。

我有以下格式的表格:

No | User | Value
01 | Port | Funds   
01 | Vip1 | Systems  
02 | Port | Bank  
02 | Vip1 | Authority  

这就是我想要的:

No | Port  | Vip1
01 | Funds | Systems   
02 | Bank  | Authority  

现在的问题是,在这个表中,除了 Port 和 Vip1 之外,User 列还有 6 个其他条目。所以我想要 6 列和它们各自的值。我还想要一个可以在具有不同用户列条目的其他类似表中使用的查询。这就是我试图做的没有任何成功:

SELECT 
   No, 
   CASE user WHEN 'Port' THEN Value ELSE NULL END AS Port,  
   CASE user WHEN 'Vip1' THEN Value ELSE NULL END AS Vip1  
FROM table1

请让我知道你的想法。

4

1 回答 1

1

你很亲密。你需要的是聚合:

SELECT 
   No, 
   max(CASE user WHEN 'Port' THEN Value END) AS Port,  
   max(CASE user WHEN 'Vip1' THEN Value END) AS Vip1  
FROM table1
group by No;

我还删除了else NULL. 默认情况下,当没有匹配时case语句返回。NULL

编辑:

实际上,在 Oracle 中,您可以做一些事情。但是,您只有通用名称(除非您使用动态 SQL):

select no,
       max(case when usernum = 1 then value end) as Val1,
       max(case when usernum = 2 then value end) as Val2,
       max(case when usernum = 3 then value end) as Val3,
       max(case when usernum = 4 then value end) as Val4,
       max(case when usernum = 5 then value end) as Val5,
       max(case when usernum = 6 then value end) as Val6,
       max(case when usernum = 1 then user end) as User1,
       max(case when usernum = 2 then user end) as User2,
       max(case when usernum = 3 then user end) as User3,
       max(case when usernum = 4 then user end) as User4,
       max(case when usernum = 5 then user end) as User5,
       max(case when usernum = 6 then user end) as User6
from (select t.*, dense_rank() over (order by user) as usernum
      from table1 t
     ) t
group by No;

这将返回 6 列的值和另外 6 列的名称。这可能不是您正在寻找的。但是,如果没有动态 SQL,它可能是您能做的最好的事情。

于 2013-08-06T20:57:22.493 回答