测试数据:
CREATE TABLE test (name char(10),subject char(10),score int)
go
insert test values( '张三 ', '语文 ',80)
insert test values( '张三 ', '数学 ',86)
insert test values( '张三 ', '英语 ',75)
insert test values( '李四 ', '语文 ',78)
insert test values( '李四 ', '数学 ',85)
insert test values( '李四 ', '英语 ',78)
select * from test
--
--想变成以下效果
--
-- 姓名 语文 数学 英语
-- 张三 80 86 75
-- 李四 78 85 78
--T-SQL
MS SQL Server中
分析一下思路
1.先通过CASE,将各科目分别开来,
2.再统计一下各科目的成绩.
---1.先分列
select name,
case t.subject when '语文' then t.score else 0 end as 语文,
case t.subject when '数学' then t.score else 0 end as 数学,
case t.subject when '英语' then t.score else 0 end as 英语
from test t
group by t.name
---2.再对列求和
select name,
sum(case t.subject when '语文' then t.score else 0 end ) 语文,
sum(case t.subject when '数学' then t.score else 0 end ) 数学,
sum(case t.subject when '英语' then t.score else 0 end ) 英语
from test t
group by t.name
主表
人名表
按照常规查询
SELECT s.SName, c.CName,s2.SCgrade
FROM S s INNER JOIN SC s2 ON s2.SNo = s.SNo INNER JOIN C c ON c.CNo = s2.CNo
那么结果是这样的
但是这是横表 不是我想看到的结果。
我们要看到这样的结果:
那么怎么办呢?
第一种写法:SELECT w.SName,
sum(case when w.CNo= 1 then w.SCgrade ELSE 0 END) AS '语文',
sum(case WHEN w.CNo =2 THEN w.SCgrade ELSE 0 END) AS '数学',
sum(case when w.CNo= 3 then w.SCgrade ELSE 0 END) AS '英语'
FROM
(SELECT s.SNo,s.SName, s2.CNo, s2.SCgrade FROM s s INNER JOIN SC s2 ON s2.SNo = s.SNo WHERE s.SNo IN (SELECT c.SNo FROM sc c GROUP BY c.SNo ))
AS w GROUP BY w.SName
第二种写法: SELECT s.SName,
sum(case when s2.CNo= 1 then s2.SCgrade ELSE 0 END) AS '语文',
sum(case WHEN s2.CNo =2 THEN s2.SCgrade ELSE 0 END) AS '数学',
sum(case when s2.CNo= 3 then s2.SCgrade ELSE 0 END) AS '英语'
FROM
S s INNER JOIN SC s2 ON s2.SNo = s.SNo
INNER JOIN C c ON c.CNo = s2.CNo
GROUP BY s.SNo,
s.SName
这是我工作遇到过得情况,总结下来。如果有遇到这种情况的话可以参考下。