Sql server 无法在SQL Server 2008 R2中执行动态数据透视
我需要在SQLServer2008R2中进行数据透视。我有一个EMP表,其中有员工记录,然后有一个子表,其中存储了相关的子记录 现在我想在输出中为每个员工创建一条记录。我不知道如何放置Child1Name,Child2Name,Child3Name。。。。列侧的名称。下面是示例输入和输出。蒂亚Sql server 无法在SQL Server 2008 R2中执行动态数据透视,sql-server,sql-server-2008-r2,pivot,dynamic-pivot,Sql Server,Sql Server 2008 R2,Pivot,Dynamic Pivot,我需要在SQLServer2008R2中进行数据透视。我有一个EMP表,其中有员工记录,然后有一个子表,其中存储了相关的子记录 现在我想在输出中为每个员工创建一条记录。我不知道如何放置Child1Name,Child2Name,Child3Name。。。。列侧的名称。下面是示例输入和输出。蒂亚 谢谢,让我检查一下。谢谢,它对这个部分用例有效。你能再帮点忙吗?我需要以这种方式添加配偶。一个Emp可能有也可能没有多个类似配偶的孩子。那么,我们怎样才能做到呢?将内部连接更改为左外部CouthPoess
谢谢,让我检查一下。谢谢,它对这个部分用例有效。你能再帮点忙吗?我需要以这种方式添加配偶。一个Emp可能有也可能没有多个类似配偶的孩子。那么,我们怎样才能做到呢?将内部连接更改为左外部CouthPoess表与子表一样好,或者将其视为子副本。然后配偶的名字也应该像spoose1name,spoose2name等出现…嗨,我仍然不能做嵌套旋转。你能展示一些示例代码吗?那将是一个很好的帮助。
/*
My Sql server 2012
the code below can run at above 2005
*/
set nocount on
;with EmpTable as (
select *
from (values(1,'John'),(2,'Tim'),(3,'Steve')) as a(ID,Name)
),
ChildTable as(
select *
from (values(1,1,'Tina'),(2,1,'Mike'),(3,2,'Mona'),(4,3,'Zane'),(5,3,'Diana'),(6,3,'Marry')) as b(ID,EmpID,Name)
),
sourceData as(
select a.Name,b.EmpID,b.Name as ChildName,row_number() over(partition by EmpID order by B.ID,b.Name) as rn
from EmpTable as a inner join ChildTable as b on a.ID = b.EmpID
)
select EmpID,Name,[1] as Child1Name,[2] as Child2Name,[3] as Child3Name
from sourceData as a pivot (max(ChildName) for rn in([1],[2],[3]))as b
/*
EmpID Name Child1Name Child2Name Child3Name
----------- ----- ---------- ---------- ----------
1 John Tina Mike NULL
2 Tim Mona NULL NULL
3 Steve Zane Diana Marry
*/
/*
Dynamic pivoting
My Sql server 2012
the code below can run at above 2005
*/
--step 1 :
set nocount on
;with EmpTable as (
select *
from (values(1,'John'),(2,'Tim'),(3,'Steve')) as a(ID,Name)
),
ChildTable as(
select *
from (values(1,1,'Tina'),(2,1,'Mike'),(3,2,'Mona'),(4,3,'Zane'),(5,3,'Diana'),(6,3,'Marry')) as b(ID,EmpID,Name)
),
sourceData as(
select a.Name,b.EmpID,b.Name as ChildName,row_number() over(partition by EmpID order by B.ID,b.Name) as rn
from EmpTable as a inner join ChildTable as b on a.ID = b.EmpID
)
select * into #a
from sourceData
--Step 2:
declare @PivotColumn as varchar(5000),@DisplayColumn as varchar(5000),@Sql as nvarchar(4000)
;with columnData as ( select distinct rn from #a)
select @PivotColumn = isnull(@PivotColumn,'')+quotename(cast(rn as varchar))+',',@DisplayColumn= isnull(@DisplayColumn,'')+quotename(cast(rn as varchar))+' as Child'+cast(rn as varchar)+'Name,'
from columnData
set @PivotColumn = left(@PivotColumn,len(@PivotColumn)-1)
set @DisplayColumn = left(@DisplayColumn,len(@DisplayColumn)-1)
set @Sql = 'select EmpID,Name,'+@DisplayColumn+' from #a as a pivot(max(ChildName) for rn in ('+@PivotColumn+')) as b'
exec sp_executesql @sql
/*
EmpID Name Child1Name Child2Name Child3Name
----------- ----- ---------- ---------- ----------
1 John Tina Mike NULL
2 Tim Mona NULL NULL
3 Steve Zane Diana Marry
*/