下面是使用OLAP功能更通用的例子。这将获得每个名称的前四对电话类型和电话号码。如果有人少于四人,剩下的人将被填入NULL。很明显,你如何将这个扩展到四个以上。
select * from (
select id,
min(id) over (partition by name) as first_id,
name,
phone_type as phone_type1,
phone_no as phone_no1,
lead(phone_type,1) over (partition by name order by id) as phone_type2,
lead(phone_no,1) over (partition by name order by id) as phone_type2,
lead(phone_type,2) over (partition by name order by id) as phone_type3,
lead(phone_no,2) over (partition by name order by id) as phone_type3,
lead(phone_type,3) over (partition by name order by id) as phone_type4,
lead(phone_no,3) over (partition by name order by id) as phone_type4
from table
) where id = first_id
外部选择保证你每人只能得到一行。您需要这样做是因为OLAP函数的结果(本例中为min(id)
)不能直接放入where子句中。
你在输出中寻找什么列? – 2012-08-13 14:52:38
**什么**数据库系统,以及哪个版本? * SQL *只是*结构化查询语言* - 许多数据库系统使用的语言,但不是数据库产品......这样的功能通常是特定于供应商的 - 因此我们确实需要知道**数据库系统**你正在使用.... – 2012-08-13 14:54:30
看看http://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string中的答案 – 2012-08-13 14:55:20