多行转换成一行多列
表a:
id bindid name
1 1 wang
2 2 zhang
表b:
id bindid address
1 1 aaa
2 1 bbb
3 2 ccc
4 2 ddd
想实现的效果:
bindid name address1 address2
1 wang aaa bbb
2 zhang ccc ddd
请大神帮忙解答
------解决方案------------------------------------------------------------------------------------
-- Author :DBA_HuangZJ(發糞塗牆)
-- Date :2014-09-04 15:12:17
-- Version:
-- Microsoft SQL Server 2012 - 11.0.5058.0 (X64)
-- May 14 2014 18:34:29
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据:[A]
if object_id('[A]') is not null drop table [A]
go
create table [A]([id] int,[bindid] int,[name] varchar(5))
insert [A]
select 1,1,'wang' union all
select 2,2,'zhang'
--> 测试数据:[B]
if object_id('[B]') is not null drop table [B]
go
create table [B]([id] int,[bindid] int,[address] varchar(3))
insert [B]
select 1,1,'aaa' union all
select 2,1,'bbb' union all
select 3,2,'ccc' union all
select 4,2,'ddd'
--------------开始查询--------------------------
select a.id,a.bindid,a.NAME,MAX(CASE WHEN b.id2=1 THEN ADDRESS ELSE NULL END )[address1],MAX(CASE WHEN b.id2=2 THEN ADDRESS ELSE NULL END )[address2]
from [A] a LEFT JOIN (SELECT *,ROW_NUMBER()OVER(PARTITION BY bindid ORDER BY id)id2 FROM [b]) [b] ON a.bindid=b.bindid
GROUP BY a.id,a.bindid,a.NAME
----------------结果----------------------------
/*
id bindid NAME address1 address2
----------- ----------- ----- -------- --------
1 1 wang aaa bbb
2 2 zhang ccc ddd
*/
------解决方案--------------------1楼是静态的,这是动态的
----------------------------------------------------------------
-- Author :DBA_HuangZJ(發糞塗牆)
-- Date :2014-09-04 15:12:17
-- Version:
-- Microsoft SQL Server 2012 - 11.0.5058.0 (X64)
-- May 14 2014 18:34:29
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据:[A]
if object_id('[A]') is not null drop table [A]
go
create table [A]([id] int,[bindid] int,[name] varchar(5))
insert [A]
select 1,1,'wang' union all
select 2,2,'zhang'
--> 测试数据:[B]
if object_id('[B]') is not null drop table [B]
go
create table [B]([id] int,[bindid] int,[address] varchar(3))
insert [B]
select 1,1,'aaa' union all
select 2,1,'bbb' union all
select 3,2,'ccc' union all
select 4,2,'ddd'
--------------开始查询--------------------------
--select a.id,a.bindid,a.NAME,MAX(CASE WHEN b.id2=1 THEN ADDRESS ELSE NULL END )[address1],MAX(CASE WHEN b.id2=2 THEN ADDRESS ELSE NULL END )[address2]
--from [A] a LEFT JOIN (SELECT *,ROW_NUMBER()OVER(PARTITION BY bindid ORDER BY id)id2 FROM [b]) [b] ON a.bindid=b.bindid