一个表行变列与另一个表组成新表的问题

ahking 2016-01-11 10:43:11
表t1
ID F1
1 aa
2 bb

表t2
t1_ID unit Num
1 公司1 5
1 公司2 10
2 公司1 1000
2 公司2 2000

连接后的表为
ID F1 公司1num 公司2num
1 aa 5 10
2 bb 1000 2000
...全文
114 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2016-01-12
  • 打赏
  • 举报
回复
use Tempdb
go
--> --> 
  
if not object_id(N'Tempdb..#t1') is null
    drop table #t1
Go
Create table #t1([ID] int,[F1] nvarchar(2))
Insert #t1
select 1,N'aa' union all
select 2,N'bb'
Go
 
if not object_id(N'Tempdb..#t2') is null
    drop table #t2
Go
Create table #t2([t1_ID] int,[unit] nvarchar(3),[Num] INT,price MONEY)
Insert #t2
select 1,N'公司1',5 ,100union all
select 1,N'公司2',10,20 union all
select 2,N'公司1',1000,5 union all
select 2,N'公司2',2000,3
Go
declare @Sql nvarchar(max)='',@Sql2 NVARCHAR(max)=''
 
select @Sql= @Sql+','+quotename(unit+'Num')+'=sum(case when b.unit='+QUOTENAME(unit,'''')+' then Num else 0 END) '
,@Sql2= @Sql2+','+quotename(unit+'price')+'=sum(case when b.unit='+QUOTENAME(unit,'''')+' then price else 0 END) '
 from #t2 group by unit 
 
EXEC('SELECT a.ID,a.F1'+@Sql+@Sql2+' FROM #t1 AS a inner join #t2 as b on a.ID=b.t1_id group by a.ID,a.F1')
/*
ID	F1	公司1Num	公司2Num	公司1price	公司2price
1	aa	5	10	100.00	20.00
2	bb	1000	2000	5.00	3.00
*/
中国风 2016-01-12
  • 打赏
  • 举报
回复
引用 3 楼 ahking 的回复:
t1_ID unit Num price 1 公司1 5 100 1 公司2 10 20 2 公司1 1000 5 2 公司2 2000 3 连接后的表为 ID F1 公司1num 公司2num 公司1price 公司2price 1 aa 5 10 100 20 2 bb 1000 2000 5 3 如果表二有多个需要转置的列,用pivot好实现么?
可以,效率低,有两列时,必须要两个派生表再连,需用两次pivot
ahking 2016-01-12
  • 打赏
  • 举报
回复
t1_ID unit Num price 1 公司1 5 100 1 公司2 10 20 2 公司1 1000 5 2 公司2 2000 3 连接后的表为 ID F1 公司1num 公司2num 公司1price 公司2price 1 aa 5 10 100 20 2 bb 1000 2000 5 3 如果表二有多个需要转置的列,用pivot好实现么?
ahking 2016-01-12
  • 打赏
  • 举报
回复
这个有没有别的解决方法么?
中国风 2016-01-11
  • 打赏
  • 举报
回复
use Tempdb
go
--> --> 
 
if not object_id(N'Tempdb..#t1') is null
	drop table #t1
Go
Create table #t1([ID] int,[F1] nvarchar(2))
Insert #t1
select 1,N'aa' union all
select 2,N'bb'
Go

if not object_id(N'Tempdb..#t2') is null
	drop table #t2
Go
Create table #t2([t1_ID] int,[unit] nvarchar(3),[Num] int)
Insert #t2
select 1,N'公司1',5 union all
select 1,N'公司2',10 union all
select 2,N'公司1',1000 union all
select 2,N'公司2',2000
Go
declare @Sql nvarchar(max)=''

select @Sql= @Sql+','+quotename(unit+'Num')+'=sum(case when b.unit='+QUOTENAME(unit,'''')+' then Num else 0 END) ' from #t2 group by unit 

EXEC('SELECT a.ID,a.F1'+@Sql+' FROM #t1 AS a inner join #t2 as b on a.ID=b.t1_id group by a.ID,a.F1')

/*
ID	F1	公司1Num	公司2Num
1	aa	5	10
2	bb	1000	2000
*/
中国风 2016-01-11
  • 打赏
  • 举报
回复
declare @Sql nvarchar(max)=''

select @Sql= @Sql+','+quotename(unit+'Num')+'=sum(case when b.unit='+QUOTENAME(unit,'''')+' then Num else 0 END) ' from T2 group by unit

EXEC('SELECT a.ID,a.F1'+@Sql+' FROM T1 AS a inner join T2 as b on a.ID=b.t1_id group by a.ID,a.F1')


其它 方法参照
http://bbs.csdn.net/topics/240002706

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧