Sql 如何将两条记录合并为一行?

Sql 如何将两条记录合并为一行?,sql,db2,Sql,Db2,假设我有一个表,其中包含id、name、phone\u type、phone\u no 我有两张唱片 {1, Tom, home, 123} {2, Tom, mobile, 234} 如果我只使用sql: SELECT * FROM table WHERE name = tom; 它将显示这两个记录 但是,我想在一行中显示如下内容: Tom, mobile,234,home,123 像这样的事 如何在db2中修改sql 请帮助。这里有一种方法: select name,

假设我有一个表,其中包含
id、name、phone\u type、phone\u no

我有两张唱片

{1, Tom, home, 123}
{2, Tom, mobile, 234}  
如果我只使用sql:

SELECT * FROM table WHERE name = tom;
它将显示这两个记录

但是,我想在一行中显示如下内容:

Tom, mobile,234,home,123
像这样的事

如何在db2中修改sql

请帮助。

这里有一种方法:

select name,
       'mobile',
       max(case when ttype = 'mobile' then phone end) as mobilephone,
       'home',
       max(case when ttype = 'home' then phone end) as homephone
from t
group by name

这可能会给你一个想法

declare @rVal nvarchar(128)
set @rVal = 'Tom'
select @rVal = @rval + coalesce(',' + phoneType + ',' + convert(nvarchar,phoneNumber),'') from testTable where name = 'Tom'
select @rVal

下面是一个使用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子句中。

您在输出中查找哪些列?哪个数据库系统,哪个版本??SQL只是结构化查询语言-一种被许多数据库系统使用的语言,但不是一种数据库产品。。。像这样的功能通常是特定于供应商的-所以我们真的需要知道您使用的是什么数据库系统…看看中的答案总是只有两种类型的电话吗?这些总是
'mobile'
'home'
?如果没有,请您描述每一种可能的情况,以及您想要什么输出?(注意:如果您可以有任意数量的电话类型,实际上标准做法是保持数据与您已有的数据完全相同。)有些人只有mobile,有些人可能有mobile和Home。这在我的DB2版本(在iSeries上)上是无效的语法,并且不会以任何方式返回连接的行(只有列,这有点傻。)而
COALESCE()
是没有用的,因为它总是有数据(因为
,“
)。如果您希望它在循环中运行……在处理SQL时,您需要停止像命令式程序员那样思考(您正在与系统作斗争).并非所有版本的DB2都支持
lead()
,虽然OP没有列出他正在使用的版本。这也将结果限制为4个电话号码-如果OP只需要2个电话号码,我可能只尝试自加入,而不是尝试使用OLAP功能;如果他需要4个以上的电话号码,你将需要其他号码…正如我提到的,这将很容易扩展到4.J以上必须添加更多的lead()行对,直到您能够处理尽可能多的数据。不,这个解决方案并不漂亮,但不幸的是,在DB2中没有一种优雅的方法来做到这一点。