34,575
社区成员
发帖
与我相关
我的任务
分享
表名 字段0 字段1 字段2 字段3 字段4 字段5 字段6 字段7 字段8 字段9 字段10 字段11 字段12 字段13 字段14 字段15 字段16 字段17 字段18 字段19
YSFGGA 销售开票单头档 发票号码 发票性质 发票种类 发票来源 发票日期 客户 部门 业务员 币种 汇率 税率 专案 预收款日 备注 凭证抛砖否 凭证编号 性质 发票处理 无税金额
TPABBA 币种汇率档 币种编号 货币名称 汇率 英文名称 预留字段1 预留字段2 录入者编号 录入时间 更改者编号 更改时间 更新标记
if object_id('tb') is not null drop table tb
go
create table tb(姓名 varchar(10),课程 varchar(10),分数 int)
insert into tb values('张三','语文',74)
insert into tb values('张三','数学',83)
insert into tb values('张三','物理',93)
insert into tb values('李四','语文',74)
insert into tb values('李四','数学',84)
insert into tb values('李四','物理',94)
go
select* from tb
go
-------------------------------使用SQL Server 2000静态SQL
select 姓名,
max(case 课程 when'语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名
-------------------------------使用SQL Server 2000动态SQL
-------变量按sql语言顺序赋值
declare @sql varchar(500)
set @sql='select 姓名'
select @sql=@sql+',max(case 课程 when '''+课程+''' then 分数 else 0 end)['+课程+']'
from(select distinct 课程 from tb) a--同from tb group by课程,默认按课程名排序
print @sql
set @sql=@sql+' from tb group by 姓名'
exec(@sql)
-------使用isnull(),变量先确定动态部分
declare @sql varchar(8000)
select @sql=isnull(@sql+',','')+' max(case 课程 when '''+课程+''' then 分数 else 0 end) ['+课程+']'
from(select distinct 课程 from tb) as a
print @sql
set @sql='select 姓名,'+@sql+' from tb group by 姓名'
exec(@sql)
-------------------------------使用SQL Server 2005静态SQL
select * from tb pivot(max(分数) for 课程 in (语文,数学,物理)) a
-------------------------------使用SQL Server 2005动态SQL
-------使用stuff()
declare @sql varchar(8000)
set @sql='' --初始化变量@sql
select @sql=@sql+','+课程 from tb group by 课程--变量多值赋值
print @sql-----------------,数学,物理,语文
set @sql=stuff(@sql,1,1,'')-------去掉首个','
print @sql
set @sql='select * from tb pivot (max(分数) for 课程 in ('+@sql+')) a'
exec(@sql)
-------使用isnull()
declare @sql varchar(8000)
select @sql=isnull(@sql+',','')+课程 from tb group by 课程
print @sql
set @sql='select * from tb pivot (max(分数) for 课程 in ('+@sql+')) a'
print @sql
exec(@sql)
-------------------------------行转列结果加上总分、平均分
-------SQL SERVER 2000静态SQL
select 姓名,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学 'then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理,
sum(分数) 总分,
cast(avg(分数*1.0) as decimal(18,2))平均分
from tb
group by 姓名
-------SQL SERVER 2000动态SQL
declare @sql varchar(8000)
set @sql='select 姓名'
select @sql=@sql+',max(case 课程 when '''+课程+''' then 分数 else 0 end)['+课程+']'
from (select distinct 课程 from tb) a
set @sql=@sql+',sum(分数) 总分,cast(avg(分数*1.0) as decimal(18,2)) 平均分 from tb group by 姓名'
print @sql
exec(@sql)
-------使用SQL Server 2005静态SQL
select m.*,n.总分,n.平均分
from
(select * from tb pivot(max(分数) for 课程 in(语文,数学,物理)) a) m,
(select 姓名,sum(分数) 总分,cast(avg(分数*1.0) as decimal(18,2)) 平均分
from tb
group by 姓名) n
where m.姓名=n.姓名
-------------------------------使用SQL Server 2005动态SQL
-------使用stuff()
declare @sql varchar(8000)
set @sql='' --初始化变量@sql
select @sql=@sql+','+课程 from tb group by 课程--变量多值赋值---同select @sql = @sql + ','+课程from (select distinct课程from tb)a
print @sql
set @sql=stuff(@sql,1,1,'')--去掉首个','
set @sql='select m.* , n.总分,n.平均分 from
(select * from tb pivot (max(分数) for 课程 in ('+@sql+')) a) m ,
(select 姓名,sum(分数)总分, cast(avg(分数*1.0) as decimal(18,2)) 平均分 from tb group by 姓名) n
where m.姓名= n.姓名'
print @sql
exec(@sql)
-------使用isnull()
declare @sql varchar(8000)
select @sql=ISNULL(@sql+',','')+课程 from tb group by 课程
print @sql
set @sql='select m.*,n.总分,n.平均分 from
(select * from tb pivot(max(分数) for 课程 in ('+@sql+')) a) m,
(select 姓名,SUM(分数) 总分,CAST(AVG(分数) as decimal(18,2)) 平均分 from tb group by 姓名) n
where m.姓名=n.姓名'
exec(@sql)
全套一起给你了!
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Point]') AND type in (N'U'))
DROP TABLE [dbo].[Point]
GO
CREATE TABLE [dbo].[Point](
[Id] [uniqueidentifier] NULL,
[Name] [varchar](50) NULL,
[ScoreName] [varchar](50) NULL,
[Point] [decimal](18, 2) NULL
) ON [PRIMARY]
GO
insert into Point(Id,name,ScoreName,point)values(newid(),'张三','语文',71)
insert into Point(Id,name,ScoreName,point)values(newid(),'张三','数学',72)
insert into Point(Id,name,ScoreName,point)values(newid(),'李四','语文',73)
insert into Point(Id,name,ScoreName,point)values(newid(),'李四','数学',74)
declare @sql varchar(8000)
set @sql = 'select name'
select @sql = @sql + ',max(case ScoreName when '''+ScoreName+''' then point else 0 end) ['+ScoreName+']'
from (select ScoreName from POINT Group by ScoreName) t
set @sql = @sql + ' from POINT group by name'
+' '
print @sql
exec(@sql)
select * into #t from t -- 获取字段列数据导入到临时表
--select name as 表名,[0] as 字段0 from t a
--pivot(max(val) for minor_id in ([0],[1])) b
declare @m int,@sql nvarchar(max),@n int
select @m = 150,@n=0,@sql = 'select name as 表名,[FieldAlias] from #t a pivot(max(val) for minor_id in ([FieldList])) b'
while @n<@m
begin
if exists(select top 1 1 from #t where minor_id=@n)
begin
set @sql=replace(replace(@sql,'[FieldList]','['+convert(varchar(4),@n)+'],[FieldList]'),'[FieldAlias]','['+convert(varchar(4),@n)+'] as 字段' +convert(varchar(4),@n)+ ',[FieldAlias]')
end
set @n=@n+1
end
set @sql = replace(replace(@sql,',[FieldList]',''),',[FieldAlias]','')
--select @sql
exec(@sql)
drop table #t