34,838
社区成员




DECLARE @SQL VARCHAR(8000)
SET @SQL='SELECT 表1.姓名,表1.地址,A.* FROM(SELECT 区域'
SELECT @SQL= @SQL+
',min(CASE WHEN 类型 = ''' + 类型 + ''' THEN 价格 END) [' + 类型 + ']'
FROM (SELECT DISTINCT 类型 FROM 表2) A
SET @SQL=@SQL+' FROM 表2 GROUP BY 区域)A INNER JOIN 表1 ON 表1.区域 = A.区域'
EXEC (@SQL)
--建立测试环境
Create Table 表1(区域 varchar(100),姓名 varchar(100),地址 varchar(100))
--插入数据
insert into 表1
select '长春','张三','**街**号1' union
select '长春','李四','**街**号2' union
select '长春','王五','**街**号3' union
select '吉林','赵六','**街**号4' union
select '吉林','于七','**街**号5' union
select '吉林','吴八','**街**号6'
Create Table 表2(区域 varchar(100),类型 varchar(100),价格 varchar(100))
--插入数据
insert into 表2
select '长春','1.标准全球通','234' union
select '长春','2.全球通资费套餐','5423' union
select '长春','3.全球通优惠','454' union
select '吉林','1.标准全球通','297' union
select '吉林','2.全球通资费套餐','12' union
select '吉林','3.全球通优惠','29949'
go
--建动态转换存储过程
create proc vv
as
begin
DECLARE @SQL VARCHAR(8000)
select @sql = 'alter table #vv add 区域 varchar(100)'
select @sql = @sql + ' ,['+类型+'] varchar(100)' from 表2 group by 类型
exec(@sql)
alter table #vv drop column vvidvv
SET @SQL=' insert #vv SELECT 区域'
SELECT @SQL= @SQL+
',min(CASE WHEN 类型 = ''' + 类型 + ''' THEN 价格 END) [' + 类型 + ']'
FROM (SELECT DISTINCT 类型 FROM 表2) A
SET @SQL=@SQL+' FROM 表2 GROUP BY 区域'
exec (@SQL)
end
go
--调用
create table #vv(vvidvv int)
exec vv
select b.姓名,b.地址,a.* from #vv a,表1 b where a.区域 = b.区域
drop table #vv --别忘了清临时表
--调用结束
go
drop proc vv
go
Drop Table 表1,表2
/*
姓名 地址 区域 1.标准全球通 2.全球通资费套餐 3.全球通优惠
---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
李四 **街**号2 长春 234 5423 454
王五 **街**号3 长春 234 5423 454
张三 **街**号1 长春 234 5423 454
吴八 **街**号6 吉林 297 12 29949
于七 **街**号5 吉林 297 12 29949
赵六 **街**号4 吉林 297 12 29949
*/
create table #vv(vvidvv int)--标准写法,不能改动,包括表名和字段名
exec vv --执行存储过程
select * from #vv --数据在#vv 表中了
create PROCEDURE proc1
declare @sql varchar(8000)
set @sql = 'create view my_view as select 区域 '
select @sql = @sql + ' , max(case 类型 when ''' + 类型 + ''' then 价格 else 0 end) [' + 类型 + ']'
from (select distinct 类型 from 表) as a
set @sql = @sql + ' from 表 group by 区域'
exec(@sql)
select * from my_view//这里你还要关联其他表或视图
drop view my_view
Create Table 表(区域 varchar(100),类型 varchar(100),价格 varchar(100))
--插入数据
insert into 表
select '1长春','1.标准全球通','234' union
select '1长春','2.全球通资费套餐','5423' union
select '1长春','3.全球通优惠','454' union
select '2吉林','1.标准全球通','297' union
select '2吉林','2.全球通资费套餐','12' union
select '2吉林','3.全球通优惠','29949'
go
create proc vv
as
begin
DECLARE @SQL VARCHAR(8000)
select @sql = 'alter table #vv add 区域 varchar(100)'
select @sql = @sql + ' ,['+类型+'] int' from 表 group by 类型
exec(@sql)
alter table #vv drop column vvidvv
SET @SQL=' insert #vv SELECT 区域'
SELECT @SQL= @SQL+
',min(CASE WHEN 类型 = ''' + 类型 + ''' THEN 价格 END) [' + 类型 + ']'
FROM (SELECT DISTINCT 类型 FROM 表) A
SET @SQL=@SQL+' FROM 表 GROUP BY 区域'
exec (@SQL)
end
go
create table #vv(vvidvv int)
exec vv
select * from #vv
drop table #vv
go
drop proc vv
go
Drop Table 表
--建立测试环境
Create Table 表(区域 varchar(100),类型 varchar(100),价格 varchar(100))
--插入数据
insert into 表
select '长春','1.标准全球通','234' union
select '长春','2.全球通资费套餐','5423' union
select '长春','3.全球通优惠','454' union
select '吉林','1.标准全球通','297' union
select '吉林','2.全球通资费套餐','12' union
select '吉林','3.全球通优惠','29949'
go
declare @sql varchar(8000)
set @sql = 'create view my_view as select 区域 '
select @sql = @sql + ' , max(case 类型 when ''' + 类型 + ''' then 价格 else 0 end) [' + 类型 + ']'
from (select distinct 类型 from 表) as a
set @sql = @sql + ' from 表 group by 区域'
exec(@sql)
select * from my_view
drop table 表
drop view my_view
/*
区域 1.标准全球通 2.全球通资费套餐 3.全球通优惠
-----------------------------------------------
长春 234 5423 454
吉林 297 12 29949
(所影响的行数为 2 行)
*/