邹老大休息了,我来给你搞定
declare @sql varchar(8000)
set @sql = 'select 学号'
select @sql = @sql + ',sum(case 科目 when '''+科目+''' then 成绩 end) ['+科目+']'
from (select distinct 科目 from aaa) as a
select @sql = @sql+' from aaa group by 学号,班级'
print(@sql)
exec(@sql)
declare @sql varchar(8000)
set @sql = 'select 学号'
select @sql = @sql + ',sum(case 科目 when '''+科目+''' then 成绩 end) ['+科目+']'
from (select distinct 科目 from aaa) as a
select @sql = @sql+' from aaa group by 学号,班级'
print(@sql)
exec(@sql)
create procedure sp(@table varchar(800))
as
begin
declare @sql varchar(8000)
set @sql = 'select 学号'
select @sql = @sql + ',sum(case 科目 when '''+科目+''' then 成绩 end) ['+科目 +']'
from (select distinct 科目 from '+@table+') as a
select @sql = @sql+' from '+@table+' group by 学号,班级'
print(@sql)
exec(@sql)
end
as
begin
declare @excSql varchar(8000)
set @excSql = 'select 学号,班级'
select @excSql='select @sql=@sql+'''+',sum(case 科目 when '''''''+'+科目+'+''''''''+' then 成绩 end) ['''
+'+科目+'''+']'''+ ' from (select distinct 科目 from '+@Table
+') as a select @sql=@sql+'''+'from '+@Table +' where 班级='''''''+'+'''+@class+'''+'+''''''' group by 学号,班级'''
select @excSql='declare @sql varchar(8000) '+' set @sql='''+' select 学号,班级 '''+@excSql+' Exec(@sql)'
exec(@excSql)
end 在win2000下测试成功,加分吧,写了半天
from score
group by 学号,班级,科目
order by 班级,科目,学号结果是这样:
学号 班级 成绩 科目
821 软1 85 C语言
822 软1 81 C语言
823 软1 91 C语言
821 软1 95 DATABASE
822 软1 82 DATABASE
823 软1 92 DATABASE
821 软1 80 DELPHI
822 软1 83 DELPHI
823 软1 93 DELPHI
有时候需要旋转结果以便在水平方向显示列,而在垂直方向显示行。这就是所谓的创建 PivotTable®、创建交叉数据报表或旋转数据。假定有一个表 Pivot,其中每季度占一行。对 Pivot 的 SELECT 操作在垂直方向上列出这些季度:Year Quarter Amount
---- ------- ------
1990 1 1.1
1990 2 1.2
1990 3 1.3
1990 4 1.4
1991 1 2.1
1991 2 2.2
1991 3 2.3
1991 4 2.4生成报表的表必须是这样的,其中每年占一行,每个季度的数值显示在一个单独的列中,如:Year
Q1
Q2
Q3
Q4
1990
1.1
1.2
1.3
1.4
1991
2.1
2.2
2.3
2.4
下面的语句用于创建 Pivot 表并在其中填入第一个表中的数据:USE Northwind
GOCREATE TABLE Pivot
( Year SMALLINT,
Quarter TINYINT,
Amount DECIMAL(2,1) )
GO
INSERT INTO Pivot VALUES (1990, 1, 1.1)
INSERT INTO Pivot VALUES (1990, 2, 1.2)
INSERT INTO Pivot VALUES (1990, 3, 1.3)
INSERT INTO Pivot VALUES (1990, 4, 1.4)
INSERT INTO Pivot VALUES (1991, 1, 2.1)
INSERT INTO Pivot VALUES (1991, 2, 2.2)
INSERT INTO Pivot VALUES (1991, 3, 2.3)
INSERT INTO Pivot VALUES (1991, 4, 2.4)
GO下面是用于创建旋转结果的 SELECT 语句:SELECT Year,
SUM(CASE Quarter WHEN 1 THEN Amount ELSE 0 END) AS Q1,
SUM(CASE Quarter WHEN 2 THEN Amount ELSE 0 END) AS Q2,
SUM(CASE Quarter WHEN 3 THEN Amount ELSE 0 END) AS Q3,
SUM(CASE Quarter WHEN 4 THEN Amount ELSE 0 END) AS Q4
FROM Northwind.dbo.Pivot
GROUP BY Year
GO该 SELECT 语句还处理其中每个季度占多行的表。GROUP BY 语句将 Pivot 中一年的所有行合并成一行输出。当执行分组操作时,SUM 聚合中的 CASE 函数的应用方式是这样的:将每季度的 Amount 值添加到结果集的适当列中,在其它季度的结果集列中添加 0。如果该 SELECT 语句的结果用作电子表格的输入,那么电子表格将很容易计算每年的合计。当从应用程序使用 SELECT 时,可能更易于增强 SELECT 语句来计算每年的合计。例如:SELECT P1.*, (P1.Q1 + P1.Q2 + P1.Q3 + P1.Q4) AS YearTotal
FROM (SELECT Year,
SUM(CASE P.Quarter WHEN 1 THEN P.Amount ELSE 0 END) AS Q1,
SUM(CASE P.Quarter WHEN 2 THEN P.Amount ELSE 0 END) AS Q2,
SUM(CASE P.Quarter WHEN 3 THEN P.Amount ELSE 0 END) AS Q3,
SUM(CASE P.Quarter WHEN 4 THEN P.Amount ELSE 0 END) AS Q4
FROM Pivot AS P
GROUP BY P.Year) AS P1
GO带有 CUBE 的 GROUP BY 和带有 ROLLUP 的 GROUP BY 都计算与本例显示相同的信息种类,但格式稍有不同。
把表的行与列互换,这个问题的写法多了,j888曾经写过一段,老衲也写过,
现在楼主就是想把表名当变量传过去,用我的写法肯定能行的。不知道你为什么通过不了,我上面的alter改为create就行了,我在本机上做实验时写法没通过就在查询分析器中写了。
其实楼上写法是只能针对固定的几行如1.2,3,4,5等,而邹大侠上面的
proc p_qry
@班级 varchar(10)
as
declare @s varchar(8000)
set @s=''
select @s=@s+',['+科目+']=sum(case 科目 when '''+科目+''' then 成绩 else 0 end)'
from score where 班级=@班级
group by 科目
exec('select 学号,班级'+@s+' from score where 班级='''+@班级+''' group by 学号,班级')
go
已经不管多少行也是能行的,现在就是一个表名当变量的问题,如果楼主还不行可以把你的邮箱给我我把我写成的存储过程导成sql语句mail给你
--创建score1
select 821 as 学号,'软1' as 班级,'C语言' as 科目,85 as 成绩
into score
union
select 821 ,'软1','DATABASE', 95
union
select 821,'软1','DELPHI', 80
union
select 822,'软1','C语言', 81
union
select 822,'软1','DATABASE', 82
union
select 822,'软1','DELPHI', 83
union
select 823,'软1','C语言', 91
union
select 823,'软1','DATABASE',92
union
select 823,'软1','DELPHI', 93
union
select 321,'网1','VFO', 85
union
select 321,'网1','操作工',70
union
select 321,'网1','C语言',84
union
select 321,'网1','网页', 97
go
--创建score2
select * into score2 from score
go
--创建存储过程 sp_re
select * from score
select * from score2
go
create procedure sp_re(@table varchar(500),@class varchar(80))
as
begin
declare @excSql varchar(8000)
set @excSql = 'select 学号,班级'
select @excSql='select @sql=@sql+'''+',sum(case 科目 when '''''''+'+科目+'+''''''''+' then 成绩 end) ['''
+'+科目+'''+']'''+ ' from (select distinct 科目 from '+@Table
+') as a select @sql=@sql+'''+'from '+@Table +' where 班级='''''''+'+'''+@class+'''+'+''''''' group by 学号,班级'''
select @excSql='declare @sql varchar(8000) '+' set @sql='''+' select 学号,班级 '''+@excSql+' Exec(@sql)'
exec(@excSql)
end
go
--测试存储过程
exec sp_re 'score','软1'
exec sp_re 'score1','软1'
--清空垃圾
drop procedure sp_re
drop table score
drop table score2
--不知道符合不符合你的要求
--嘻嘻,哈哈,搞定了吧
结果不对,我已经把结果截图发到你的EMAIL去了,你去看看!!!!