首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

【提问】一个行转列有关问题,有点难度

2013-12-16 
【提问】一个行转列问题,有点难度人员信息表:A人员Id人员名称1李四2张三......................人员拥有卡片

【提问】一个行转列问题,有点难度

人员信息表:A
人员Id        人员名称
  1            李四
  2            张三
......................


人员拥有卡片表:B
人员Id     卡片Id    卡片号码
1          001      1234
1          002      12345
1          003      123456
2          004      2345
2          005      23456
..........................


需要以下结果:
人员Id    卡片1    卡片2    卡片3    卡片4  ....    卡片N
1         1234    12345   123456   null  null    ...
2         2345    23456   null     null  null    ..
..................................................          

[解决办法]
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-12-16 11:11:07
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
--Dec 28 2012 20:23:12 
--Copyright (c) Microsoft Corporation
--Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
--
----------------------------------------------------------------
--> 测试数据:[A]
if object_id('[A]') is not null drop table [A]
go 
create table [A]([人员Id] int,[人员名称] varchar(4))
insert [A]
select 1,'李四' union all
select 2,'张三'
--> 测试数据:
if object_id('[B]') is not null drop table [B]
go 
create table [B]([人员Id] int,[卡片Id] varchar(3),[卡片号码] int)
insert [B]
select 1,'001',1234 union all
select 1,'002',12345 union all
select 1,'003',123456 union all
select 2,'004',2345 union all
select 2,'005',23456
--------------开始查询--------------------------



declare @s nvarchar(4000)
set @s=''
Select     @s=@s+','+quotename('卡片'+CONVERT(VARCHAR(2),CONVERT(INT,[卡片Id])))+'=max(case when [卡片Id]='+quotename([卡片Id],'''')+' then [卡片号码] else NULL end)'
from (select a.[人员Id],a.[人员名称],b.[卡片Id],b.[卡片号码] from [A] LEFT JOIN b ON a.[人员Id]=b.[人员Id]) a group by [卡片Id]
exec('select [人员Id]'+@s+' from (select a.[人员Id],a.[人员名称],b.[卡片Id],b.[卡片号码] from [A] LEFT JOIN b ON a.[人员Id]=b.[人员Id]) a group by [人员Id]')
----------------结果----------------------------
/* 
人员Id        卡片1         卡片2         卡片3         卡片4         卡片5
----------- ----------- ----------- ----------- ----------- -----------
1           1234        12345       123456      NULL        NULL
2           NULL        NULL        NULL        2345        23456
*/
[b]
[解决办法]

create table B(人员Id  int,   卡片Id  varchar(10),  卡片号码 int)



insert into b
select 1          ,'001',      1234   union all
select 1          ,'002',      12345 union all
select 1          ,'003',      123456 union all
select 2          ,'004',      2345 union all
select 2          ,'005',      23456 
go

declare @sql nvarchar(max);  
  
set @sql = '';  
  
;with t  
as  
(  
select *,  
       ROW_NUMBER() over(partition by 人员Id order by 卡片Id) as rownum  
from B  
)  
  
select   
       @sql = @sql + ',max(case when rownum = '+cast(rownum as varchar)+' then 卡片号码 else null end) as 卡片'+
                      cast(rownum as varchar)  
from t  
group by rownum  
  
  
select @sql = 'select 人员Id' + @sql +   
              ' from (select *,  
                            ROW_NUMBER() over(partition by 人员Id order by 卡片Id) as rownum  
                     from B)t' +  
              ' group by 人员Id'  
                
--select @sql  
  
exec(@sql)  
/*
人员Id卡片1卡片2卡片3
1123412345123456
2234523456NULL
*/

热点排行