| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1969 人关注过本帖
标题:[讨论]用SQL实现交叉表查询
只看楼主 加入收藏
阿丰
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-5-11
收藏
 问题点数:0 回复次数:3 
[讨论]用SQL实现交叉表查询

SQL SERVER 2000 数据库“教务管理数据”中有以下5个表
学生名单表:
学籍号 int(4)
姓名 nvarchar(8)
班级编号 int(4)

学年度表:
学年度编号 smallint(2)
学期 nvarchar(10)

班级表:
班级编号 int(4)
班级 nvarchar(15)

课程名称表:
课程编号 smallint(2)
课程名称 nvarchar(15)

成绩单表:
学籍号 int(4)
学年度编号 smallint(2)
课程编号 smallint(2)
期评成绩 nvarchar(3)

已由上述5个表建立好查询“成绩查询”:
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

ALTER VIEW dbo.成绩查询
AS
SELECT TOP 100 PERCENT dbo.学年度.学期, dbo.班级.班级, dbo.学生名单.学籍号,
dbo.学生名单.班中序号, dbo.学生名单.姓名, dbo.课程名称.课程名称,
dbo.成绩单.段考成绩, dbo.成绩单.期评成绩, dbo.成绩单.学期补考, dbo.成绩单.毕业补考,
CASE WHEN (学期补考 = '补及' OR
毕业补考 = '补及') THEN '补及' ELSE 期评成绩 END AS 成绩评定,
dbo.课程名称.课程编号, dbo.学年度.学年度编号, dbo.班级.班级编号,
dbo.学生名单.在校
FROM dbo.班级 INNER JOIN
dbo.学生名单 ON dbo.班级.班级编号 = dbo.学生名单.班级编号 INNER JOIN
dbo.成绩单 ON dbo.学生名单.学籍号 = dbo.成绩单.学籍号 INNER JOIN
dbo.课程名称 ON dbo.成绩单.课程编号 = dbo.课程名称.课程编号 INNER JOIN
dbo.学年度 ON dbo.成绩单.学年度编号 = dbo.学年度.学年度编号
ORDER BY dbo.学年度.学期 DESC, dbo.班级.班级, dbo.学生名单.班中序号,
dbo.学生名单.学籍号, dbo.课程名称.课程名称

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO


如何生成SQL交叉表查询,形式如下:

学期 班级 姓名 CAD 施工技术 施工组织 ...
04-05学年上学期 03工民建1 李可 75 83 90


我是这样做:

declare @sql varchar(8000)
set @sql = 'select 学期,班级,班中序号,姓名,'
select @sql = @sql + '(case 课程名称 when '''+课程名称+'''
then 成绩评定 else '''+ +''' end) as '''+课程名称+''','
from (select distinct 课程名称,学期 from 成绩查询 where 姓名 like '%李可%' and 学期 like

'%04-05学年上学期%' ) as a
select @sql = left(@sql,len(@sql)-1) + ' from 成绩查询 '+ ' where 姓名 like

'+'''%李可%'''+' and 学期 like '+'''%04-05学年上学期%''' +' order by 学期'
exec(@sql)


结果:
学期 班级 姓名 CAD 施工技术 施工组织 ...
04-05学年上学期 03工民建1 李可 75
04-05学年上学期 03工民建1 李可 83
04-05学年上学期 03工民建1 李可 90

怎样才得下面的结果:
学期 班级 姓名 CAD 施工技术 施工组织 ...
04-05学年上学期 03工民建1 李可 75 83 90

请高手出招!

搜索更多相关主题的帖子: SQL 数据库 nvarchar int 课程 
2006-05-11 21:14
孙大圣
Rank: 2
等 级:新手上路
威 望:4
帖 子:127
专家分:0
注 册:2006-2-23
收藏
得分:0 

set @sql = 'select 学期,班级,班中序号,姓名,'
select @sql = @sql + ',SUM(case 课程名称 when '''+课程名称+'''
then 成绩评定 else '''+ +''' end) as '''+课程名称+''','
from (select distinct 课程名称,学期 from 成绩查询 where 姓名 like '%李可%' and 学期 like

'%04-05学年上学期%' ) as a
select @sql = left(@sql,len(@sql)-1) + ' from 成绩查询 where 姓名 like

'+'''%李可%'''+' and 学期 like '+'''%04-05学年上学期%''' +
' Group by 学期,班级,班中序号,姓名 order by 学期'

这样看一下,你就是没有分组





非学无以广才,非志无以成学
2006-05-12 15:22
阿丰
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-5-11
收藏
得分:0 
我按你的方法试过了,但有错,错误提示为:
服务器: 消息 409,级别 16,状态 2,行 1
sum or average aggregate 运算不能以 nvarchar 数据类型作为参数。
服务器: 消息 409,级别 16,状态 1,行 1
sum or average aggregate 运算不能以 nvarchar 数据类型作为参数。
服务器: 消息 409,级别 16,状态 1,行 1
sum or average aggregate 运算不能以 nvarchar 数据类型作为参数。
服务器: 消息 409,级别 16,状态 1,行 1
sum or average aggregate 运算不能以 nvarchar 数据类型作为参数。
服务器: 消息 409,级别 16,状态 1,行 1
sum or average aggregate 运算不能以 nvarchar 数据类型作为参数。
服务器: 消息 409,级别 16,状态 1,行 1
sum or average aggregate 运算不能以 nvarchar 数据类型作为参数。
服务器: 消息 409,级别 16,状态 1,行 1
sum or average aggregate 运算不能以 nvarchar 数据类型作为参数。
服务器: 消息 409,级别 16,状态 1,行 1
sum or average aggregate 运算不能以 nvarchar 数据类型作为参数。
服务器: 消息 409,级别 16,状态 1,行 1
sum or average aggregate 运算不能以 nvarchar 数据类型作为参数。
服务器: 消息 409,级别 16,状态 1,行 1
sum or average aggregate 运算不能以 nvarchar 数据类型作为参数。

原因是成绩评定是nvarchar 数据类型,把SUM去掉也不行,错误提示为:
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.成绩评定' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.课程名称' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.成绩评定' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.课程名称' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.成绩评定' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.课程名称' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.成绩评定' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.课程名称' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.成绩评定' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.课程名称' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.成绩评定' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.课程名称' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.成绩评定' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.课程名称' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.成绩评定' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.课程名称' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.成绩评定' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.课程名称' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.成绩评定' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
服务器: 消息 8120,级别 16,状态 1,行 1
列 '成绩查询.课程名称' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

可有办法?

[此贴子已经被作者于2006-5-13 17:21:21编辑过]

2006-05-13 17:20
阿丰
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-5-11
收藏
得分:0 
已成功!

declare @sql varchar(8000)
set @sql = 'select 学期,班级,班中序号,姓名,'
select @sql = @sql + 'max(case 课程名称 when '''+课程名称+'''
then 成绩评定 else '''+ +''' end) as '''+课程名称+''','
from (select distinct 课程名称,学期 from 成绩查询 where 姓名 like '%李可%' and 学期 like
'%04-05学年上学期%' ) as a
select @sql = left(@sql,len(@sql)-1) + ' from 成绩查询 where 姓名 like
'+'''%李可%'''+' and 学期 like '+'''%04-05学年上学期%''' +
' Group by 学期,班级,班中序号,姓名 order by 学期'
exec(@sql)

多谢版主!
2006-05-13 17:30
快速回复:[讨论]用SQL实现交叉表查询
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014134 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved