将单行结果转换为两列结果。 Unpivot错误“表达式必须具有与相应表达式相同的数据类型”

时间:2018-08-09 19:26:01

标签: oracle oracle12c

请仅阅读现在更相关的“编辑”部分。

我在oracle 12c数据库中有表,例如table_1。

table_1

我必须运行一个简单的SQL,该SQL仅返回table_1中的1行和所有列。像

select * from table_1 where col_1 = 65

但是我想要的结果是:

ExpectedResult

我进行了一些搜索,发现与我想要的this链接非常相​​似。 但是我只能通过遵循它来获得预期结果的第一列。我无法在预期结果的第二列中获取实际数据。

到目前为止,我只能写:

select v
  from (
        select 'col_1' as col_1, 'col_2' as col_2, 'col_3' as col_3, 'col_4' as col_4 from dual
       ) t
unpivot
(
  v for val in (col_1,col_2,col_3,col_4)
) u;

如何添加第二列和条件where col_1 = 65

编辑:(以上部分现在不那么相关了)

我在this链接上找到了我可以使用的示例,

select * from olympic_medal_tables

给予: olympic_medal_tables

desc olympic_medal_tables

Name          Null? Type        
------------- ----- ----------- 
NOC                 VARCHAR2(3) 
GOLD_MEDALS         NUMBER      
SILVER_MEDALS       NUMBER      
BRONZE_MEDALS       NUMBER

下面的SQL提供了我可以使用的功能,但我不希望结果中包含NOC列:

select * from olympic_medal_tables   
unpivot (medal_count for medal_colour in (   
  gold_medals as 'GOLD',   
  silver_medals as 'SILVER',   
  bronze_medals as 'BRONZE'
));

结果: result

所以当我也添加NOC时(这样它就不会作为结果列添加):

select * from olympic_medal_tables   
unpivot (medal_count for medal_colour in (   
  gold_medals as 'GOLD',   
  silver_medals as 'SILVER',   
  bronze_medals as 'BRONZE',
  noc as 'NOC'
));

我收到错误消息:ORA-01790: expression must have same datatype as corresponding expression在第6行Error at Line: 44 Column: 3

我也尝试过使用TO_NUMBER和TO_CHAR,但是随后出现各种语法错误。 问题:仅两列如何获得预期结果。这种使用unpivot的方法是否可能?

1 个答案:

答案 0 :(得分:1)

这是一个选项,要求您首先选择一行,然后对其应用UNPIVOT

SQL> with test (col1, col2, col3, col4) as
  2    (select '12', 'hfkds' , 'hk435k'  , '32'  from dual union
  3     select '34', 'ldkfgj', 'fsjd4653', '324' from dual union
  4     select '65', 'ifd'   , 'dkfjs345', '23'  from dual union
  5     select '87', 'dg'    , '345jh'   , '65'  from dual
  6    ),
  7  one_row as
  8    (select * From test
  9     where col1 = '65'
 10    )
 11  select *
 12  from one_row
 13  unpivot (col_value for col_name in
 14              (col1 as 'col1', col2 as 'col2', col3 as 'col3', col4 as 'col4'));

COL_ COL_VALU
---- --------
col1 65
col2 ifd
col3 dkfjs345
col4 23

SQL>