22,209
社区成员
发帖
与我相关
我的任务
分享
ISNULL(t.分数,60) AS 分数
ISNULL(Convert(varchar(11),t.分数),'?') AS 分数
-- 用临时表做的测试数据
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 ID
SET @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
DECLARE @SQL VARCHAR(8000)
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)
SELECT [姓名]
,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 [姓名]