Sql 如何使特定字段成为单独的列?

Sql 如何使特定字段成为单独的列?,sql,oracle11g,pivot,plsqldeveloper,Sql,Oracle11g,Pivot,Plsqldeveloper,Oracle Database 11g Enterprise Edition 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

Oracle Database 11g Enterprise Edition 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

请让我知道你的想法

你们非常接近。您需要的是聚合:

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):


这将返回6列的值和6列的名称。这可能不是你想要的。但是,如果没有动态SQL,这可能是您所能做的最好的事情。

我们认为您应该首先向我们展示您的尝试。在尝试解决此问题时,您是否遇到了特定的问题,或者您只是要求我们为您做工作?此类任务通常通过PIVOT解决[,但是,如果需要具有可变数量的列,则必须使用dynamic query[和/或PIVOT XML[
USER
是一个内置函数。您将希望避免使用关键字和内置函数作为列名。谢谢您的帮助。但是如果用户列中的字段未知怎么办?我只能在知道字段为Port或Vip1的情况下使用case。如果有5个其他字段怎么办?我尝试过使用它,但它提供了colu的所有值Val1中的mn字段和User1中的所有用户列字段,而其余列为空。另外,我从未使用过动态SQL,请您为我指出使用这些字段的正确方向,@user2607095…我想我已经解决了这个问题。
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;