解决方案 »
- sql server中sql语句中的逗号如何转意
- sql 2000 在没有主键以及唯一键的情况下去除重复
- 模糊查询问题,在线求助~
- 我从excel往sql server中倒数据,为什么总是抱制定的列对于指定的缓冲区太大,我用的是text呀
- 在windows下是正常的,放到linux下就保错了,请高手赐教!!
- 判断包含字符串,有没有类似sql中的 in的函数?
- 关于VFP中的combo控件
- 大数据量的性能问题
- 用触发器如何实现两台数据库服务器两个表的数据一致??? (100分,不够还可以加,在线等...)
- 请问 close database 是不是也可起到 commit work 的作用? 就是说只用 close database 而不用 commit work 可以完成对表的修改吗?
- 奇怪问题 一个条件查询正常 两个条件查询成空值
- ADODB.Recordset 错误 '800a0e7d' 连接无法用于执行此操作。在此上下文中它可能已被关闭或无效。 /Conn.asp,行 71
sum(case when 课程='语文' then 分数 else 0 end) 语文,
sum(case when 课程='数学' then 分数 else 0 end) 数学,
sum(case when 课程='物理' then 分数 else 0 end) 物理,
sum(case when 课程='英语' then 分数 else 0 end) 英语,
sum(case when 课程='德语' then 分数 else 0 end) 德语
from tb
group by 姓名
SELECT P.* FROM [学生成绩表]PIVOT(MAX([分数])FOR[课程]IN([语文],[数学],[物理],[英语],[德语]))P
如果课程不固定,还可以用动态处理
,ISNULL(MAX(CASE [课程]WHEN '语文'THEN [分数]END ),60)[语文]
,ISNULL(MAX(CASE [课程]WHEN'数学'THEN[分数]END),60)[数学]
,ISNULL(MAX(CASE [课程]WHEN'物理'THEN[分数]END),60)[物理]
,ISNULL(MAX(CASE [课程]WHEN'英语'THEN[分数]END),60)[英语]
,ISNULL(MAX(CASE [课程]WHEN'德语'THEN[分数]END),60)[德语]
FROM [学生成绩表]
GROUP BY [姓名]
SET @SQL='SELECT[姓名]'
SELECT @SQL=@SQL+',ISNULL(MAX(CASE[课程]WHEN '''+[课程]+'''THEN [分数]END ),60)['+[课程]+']'FROM(SELECT[课程]FROM[学生成绩表]GROUP BY[课程])C
SET @SQL=@SQL+'FROM[学生成绩表]GROUP BY[姓名]'
EXEC(@SQL)
你试下,如#11动态处理
WITH course(ID,课程) AS (
SELECT 1,'语文' UNION ALL
SELECT 2,'数学' UNION ALL
SELECT 3,'物理' UNION ALL
SELECT 4,'英语' UNION ALL
SELECT 5,'德语' UNION ALL
SELECT 6,'法语'
)
SELECT *
INTO #course
FROM course;WITH student(姓名) AS (
SELECT '张三' UNION ALL
SELECT '李四' UNION ALL
SELECT '王五'
)
SELECT *
INTO #student
FROM student;WITH tb (姓名,课程,分数) AS (
SELECT '张三','语文',74 UNION ALL
SELECT '张三','数学',83 UNION ALL
SELECT '张三','物理',93 UNION ALL
SELECT '张三','德语',null UNION ALL
SELECT '李四','语文',74 UNION ALL
SELECT '李四','数学',84 UNION ALL
SELECT '李四','物理',94 UNION ALL
SELECT '李四','英语',80
)
SELECT *
INTO #tb
FROM tb;-- 以下为查询部分,你自己改为实际的表名
DECLARE @sql varchar(max),
@columns varchar(max)SET @columns = '' SELECT @columns = @columns + ', [' + [课程] + ']'
FROM #course
ORDER BY IDSET @sql = '
SELECT *
FROM (
SELECT s.姓名,
c.课程,
ISNULL(t.分数,60) AS 分数
FROM #student s
JOIN #course c
ON 1=1
LEFT JOIN #tb t
ON t.姓名 = s.姓名
AND t.课程 = c.课程
) l
PIVOT (
Max (分数)
FOR 课程 IN ( ' + SubString(@columns, 3, Len(@columns)-2) + ')
) AS p'
--PRINT @sql
EXEC (@sql)
姓名 语文 数学 物理 英语 德语 法语
---- ----------- ----------- ----------- ----------- ----------- -----------
李四 74 84 94 80 60 60
王五 60 60 60 60 60 60
张三 74 83 93 60 60 60
更改为
ISNULL(Convert(varchar(11),t.分数),'?') AS 分数你既然要求几万*上千的表格,除了乘积还能用什么方法?
输出的结果
SELECT[XH],ISNULL(MAX(CASE[KCZWMC]WHEN '俄语入门'THEN [BFZCJ]END ),60)[俄语入门],ISNULL(MAX(CASE[KCZWMC]WHEN '女性学'THEN [BFZCJ]END ),60)[女性学],ISNULL(MAX(CASE[KCZWMC]WHEN '大学物理A2(西安交通大学)'THEN [BFZCJ]END ),60)[大学物理A2(西安交通大学)],ISNULL(MAX(CASE[KCZWMC]WHEN '英语阅读(教改试点三)'THEN [BFZCJ]END ),60)[英语阅读(教改试点三)],ISNULL(MAX(CASE[KCZWMC]WHEN '性学课程——爱欲与文明的对话'THEN [BFZCJ]END ),60)[中国近现代史刚要(西安交通大学)],ISNULL(MAX(CASE[KCZWMC]WHEN '毕业教育'THEN [BFZCJ]END ),60)[毕FROM [CourseMarkDB].[dbo].[CourseMark] GROUP BY[XH]然后呢
这儿是你没贴全,还是真的是这样?DECLARE @SQL NVARCHAR(MAX)
SET @SQL='SELECT[姓名]'
SELECT @SQL=@SQL+',ISNULL(MAX(CASE[课程]WHEN '''+[课程]+'''THEN [分数]END ),60)['+[课程]+']'FROM(SELECT[课程]FROM[学生成绩表]GROUP BY[课程])C
SET @SQL=@SQL+'FROM[学生成绩表]GROUP BY[姓名]'
EXEC(@SQL)试下这个
DECLARE @SQL VARCHAR(8000)
DECLARE @PIVOT VARCHAR(8000)
SET @SQL='SELECT[姓名]'
SET @PIVOT=''
SELECT @SQL=@SQL+',ISNULL(['+[课程]+'],60)['+[课程]+']',@PIVOT=@PIVOT+',['+[课程]+']'FROM(SELECT[课程]FROM[学生成绩表]GROUP BY[课程])C
SET @SQL=@SQL+'FROM[学生成绩表]PIVOT(MAX([分数])FOR[课程]IN('+STUFF(@PIVOT,1,1,'')+'))P'
EXEC(@SQL)
EXEC(@SQL)
换成PRINT @SQL
然后贴上来,有多少贴多少~~
全部复制显示有非法词组,无法发布,我省略了一下,但是保留了主要内容,去掉的都是一些重复的
SELECT[XH],ISNULL([俄语入门],60)[俄语入门],ISNULL([女性学],60)[女性学],ISNULL([大学物理A2(西安交通大学)],60)[大学物理A2(西安交通大学)]FROM [CourseMarkDB].[dbo].[CourseMark] PIVOT(MAX([BFZCJ])FOR[KCZWMC]IN([俄语入门],[女性学],[大学
全部复制显示有非法词组,无法发布,我省略了一下,但是保留了主要内容,去掉的都是一些重复的去省略的是中间的内容,首尾就是上面那样的
这样读出来的更少了,就只到ISNULL([家用电子设备的原理、使用和维护],60)[家用电子设备的原,后面那部分都没打印出来了