Oracle 10g:Unpivot列名和值

时间:2016-11-25 07:03:51

标签: sql oracle oracle10g

我有一个表和关联的值。我需要Unpivot该表并将列带到列名称的行。

在我的方案中 GL _ 列动态增长。

创建表脚本

CREATE TABLE TBL_NEWS
(
  NEWS_ID            VARCHAR2(50 BYTE) NOT NULL,
  STAFF_ID           VARCHAR2(50 BYTE),
  MODIFIED_USER      VARCHAR2(50 BYTE),
  GL_NEWS_LOCAL_BRD  NUMBER(38),
  GL_GRD_GLOBAL_BRD  NUMBER(38)

)

插入脚本

INSERT INTO TBL_NEWS (
NEWS_ID, STAFF_ID,
MODIFIED_USER,GL_NEWS_LOCAL_BRD,GL_GRD_GLOBAL_BRD) 
VALUES (1 ,100,System,50,40);


  

最后,My Result表需要看起来像这样,Allways我需要1个用户记录

COLUMN_NAME NEWSCOUNT
GL_NEWS_LOCAL_BRD 50
GL_GRD_GLOBAL_BRD 40

我试图接受这一点,通过使用以下查询,我可以采用列名。

SELECT COLUMN_NAME
FROM ALL_TAB_COLUMNS
WHERE TABLE_NAME='TBL_NEWS' AND COLUMN_NAME LIKE ('GL_%')

请帮我这样做。

1 个答案:

答案 0 :(得分:1)

您可以在oracle 11g中使用UNPIVOT并使用以下查询在Oracle 10g或更低版本中实现您的要求:

select 'GL_NEWS_LOCAL_BRD' As COLUMN_NAME,GL_NEWS_LOCAL_BRD  as NEWSCOUNT
from TBL_NEWS
union all
select 'GL_GRD_GLOBAL_BRD' as COLUMN_NAME ,GL_GRD_GLOBAL_BRD as NEWSCOUNT
from TBL_NEWS

或者,如果你有oracle 11g和上级版本,你可以使用:

select COLUMN_NAME,NEWSCOUNT
from TBL_NEWS
unpivot(  NEWSCOUNT
         for COLUMN_NAME  in (GL_NEWS_LOCAL_BRD ,GL_GRD_GLOBAL_BRD));