sql - 将多行的值作为列返回

标签 sql oracle pivot

是否可以将每个相同 ID 的多个行值作为列返回?

如果我的 table 是:

ID     | Value  |Column_data
--------------------------------  
1      | a      |  DATA1
1      | b      |  DATA1
2      | c      |  DATA2 
2      | x      |  DATA2 
3      | y      |  DATA3 
3      | z      |  DATA3

(每个 Id 始终有 2 个值)

选择应该返回:

1,a,b,数据1
2,c,x,数据2
3,y,z,数据3

最佳答案

您没有说明您使用的 Oracle 版本,但如果您使用的是 Oracle 11g+,那么您可以使用 PIVOT 函数将此数据转换为列:

select id,
  C1,
  C2,
  column_data
from
(
  select id, value, column_data,
    row_number() over(partition by id order by id, value) rn
  from yourtable
) 
pivot
(
  max(value)
  for rn in ('1' as C1, '2' as C2)
) 
order by id

参见SQL Fiddle with Demo .

在 Oracle 11g 之前,您可以使用带有 CASE 表达式的聚合函数将行转换为列:

select id,
  max(case when rn = 1 then value end) C1,
  max(case when rn = 2 then value end) C2,
  column_data
from
(
  select id, value, column_data,
    row_number() over(partition by id order by id, value) rn
  from yourtable
) 
group by id, column_data
order by id

参见SQL Fiddle with Demo

两个查询的结果是:

| ID | C1 | C2 | COLUMN_DATA |
------------------------------
|  1 |  a |  b |       DATA1 |
|  2 |  c |  x |       DATA2 |
|  3 |  y |  z |       DATA3 |

关于sql - 将多行的值作为列返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14829361/

相关文章:

python - 将多级索引的第一级旋转为多级列的第一级

python - pandas 中的数据透视会产生索引问题

sql - 将 2 个表的日期范围合并为一个表

database - 长期大量交易不好吗

.net - 使用 TableAdapter 调用 Oracle SP 非常慢

java - 将数据集从 Oracle PL/SQL 传递到 Java 的适当方法

sql - 如何在 sql server 2008 中进行双循环

sql - Oracle SQL Regexp_replace 匹配

mysql - 如何在整个 MySQL 脚本中假设一个表前缀?

php - 更新数据透视列值