zjcxc(邹建) 请进,上次的问题!(行与列)

chenzhuo 2004-04-24 01:26:19
例如有一张成绩表如下:score
学号 班级 科目 成绩
821 软1 C语言 85
821 软1 DATABASE 95
821 软1 DELPHI 80
822 软1 C语言 81
822 软1 DATABASE 82
822 软1 DELPHI 83
823 软1 C语言 91
823 软1 DATABASE 92
823 软1 DELPHI 93
...
321 网1 VFO 85
321 网1 操作工 70
321 网1 C语言 84
321 网1 网页 97


这次是输入某个班的班名,出现这样的效果,例如是"软1",
select * from score where 班级='软1'
效果是:
学号 班级 科目 成绩
821 软1 C语言 85
821 软1 DATABASE 95
821 软1 DELPHI 80
822 软1 C语言 81
822 软1 DATABASE 82
822 软1 DELPHI 83
823 软1 C语言 91
823 软1 DATABASE 92
823 软1 DELPHI 93
现在我想得到这效果:
学号 班级 C语言 DATABASE DELPHI
821 软1 85 95 80
822 软1 81 82 83
823 软1 91 92 93


你写的代码是:
--查询的存储过程
create 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

现在的问题是我这张成绩表是不定的,有score03_04,score04_04,所以我想把score
做为一个输入变量,@score,这个时候代码要怎么改.就是from score where 这里的
score要改为变量@score来代替!
...全文
93 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hmily1688 2004-04-28
  • 打赏
  • 举报
回复
没有收到
chenzhuo 2004-04-28
  • 打赏
  • 举报
回复
NO GOOD
结果不对,我已经把结果截图发到你的EMAIL去了,你去看看!!!!
hmily1688 2004-04-28
  • 打赏
  • 举报
回复
邮件我已经给你发了,但我再把具体的结果也贴在这一下
--创建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
--不知道符合不符合你的要求
--嘻嘻,哈哈,搞定了吧
hmily1688 2004-04-27
  • 打赏
  • 举报
回复
其实楼主的问题就是
把表的行与列互换,这个问题的写法多了,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给你
chenzhuo 2004-04-27
  • 打赏
  • 举报
回复
chenzhuo2@21cn.com
jf_xs 2004-04-26
  • 打赏
  • 举报
回复
不知道 hmily1688(刘涛--公司里面打杂的) 是怎么做的,我试了一下,表名用变量不能成功。这样做行不行

select 学号,班级,sum(成绩)
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

hmily1688 2004-04-26
  • 打赏
  • 举报
回复
加我QQ:41334906,我已经测试成功了
internetcsdn 2004-04-26
  • 打赏
  • 举报
回复
交叉数据报表
有时候需要旋转结果以便在水平方向显示列,而在垂直方向显示行。这就是所谓的创建 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
GO

CREATE 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 都计算与本例显示相同的信息种类,但格式稍有不同。

chenzhuo 2004-04-26
  • 打赏
  • 举报
回复
加了!
chenzhuo 2004-04-25
  • 打赏
  • 举报
回复
UP
chenzhuo 2004-04-24
  • 打赏
  • 举报
回复
代码这么复杂,搞不定!
hmily1688 2004-04-24
  • 打赏
  • 举报
回复
alter 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

在win2000下测试成功,加分吧,写了半天
hmily1688 2004-04-24
  • 打赏
  • 举报
回复
如果想传个表名做变量,这样
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
hmily1688 2004-04-24
  • 打赏
  • 举报
回复
邹老大休息了,我来给你搞定
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)
whisht 2004-04-24
  • 打赏
  • 举报
回复
下载到客户端后,在数据集里操作就好多了
PPLUNCLE 2004-04-24
  • 打赏
  • 举报
回复
今天高手都休息..呵呵!
晚上会来的...

34,576

社区成员

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

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