sqlserver中查询横表变竖表的sql语句简析
面对数据库中的三张表:课程表(CNo对应课程)、人员表(S)以及成绩表(SC),如何将横表转变为竖表展示,是我们在工作中经常遇到的问题。下面,我将通过两种SQL查询方式来解决这个问题,以供大家参考。
我们按照常规查询方式,将人员表(S)、成绩表(SC)和课程表进行内连接,查询语句如下:
```sql
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
```
查询结果呈现的是横表形式,可能无法满足我们的需求。我们希望得到的结果是竖表形式,展示每个学生的语文、数学、英语等课程的成绩。
针对这个问题,我们可以采用以下两种写法来实现竖表的查询结果:
第一种写法:
```sql
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
```
第二种写法:
```sql
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
```
以上两种写法均可以将横表转化为竖表,展示每个学生的各科目成绩。遇到类似情况的朋友们,可以参考这两种写法来解决遇到的问题。