2

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

如果我的表是:

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,DATA1
2,c,x,DATA2
3,y,z,DATA3

4

4 回答 4

1

listagg(col2) over (...)11 克

于 2013-02-12T09:38:49.407 回答
1

您没有说明您使用的是什么版本的 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

两个查询的结果是:

| ID | C1 | C2 | COLUMN_DATA |
------------------------------
|  1 |  a |  b |       DATA1 |
|  2 |  c |  x |       DATA2 |
|  3 |  y |  z |       DATA3 |
于 2013-02-12T10:18:15.840 回答
0

你可以使用pivot,看看这里:

http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html

于 2013-02-12T09:34:08.957 回答
0

你可以尝试这样的事情:

with t as ( select id, Column_data, xmlagg(xmlelement("e", Value)) xl 
from table1
group by id, Column_data)
select id, 
       extract(xl, 'e[1]/text()').getstringval() c1, 
       extract(xl, 'e[2]/text()').getstringval() c2, 
       Column_data
from t

这是一个 sqlfiddle 演示

于 2013-02-12T10:10:20.100 回答