SQL 查询以下 table 中的数据透视表
SQL query to pivot data in below table
我的考勤目录Table如下,
如上图所示,
class 中有 4 名学生的卷号为 1、2、3、4。
名为 PNT、SGP 和 DAP 的三位老师在相应的讲座时参加了相同的 class。
以上 table 显示了每个学生相对于每个老师的总缺勤情况。
我想生成如下输出,
这table说明每个学生在相应老师的课下的总缺席情况。
如何从给定的 table 得到这样的结果?
DDL 和示例数据:
create table mytable ( TeacherID varchar(3), RollNo number, Total_Absency number);
insert into mytable values('PNT', 1, 0);
insert into mytable values('PNT', 2, 4);
insert into mytable values('PNT', 3, 0);
insert into mytable values('PNT', 4, 1);
insert into mytable values('SGP', 1, 2);
insert into mytable values('SGP', 2, 1);
insert into mytable values('SGP', 3, 1);
insert into mytable values('SGP', 4, 1);
insert into mytable values('DAP', 1, 1);
insert into mytable values('DAP', 2, 1);
insert into mytable values('DAP', 3, 1);
insert into mytable values('DAP', 4, 0);
对于 Oracle,使用 PIVOT
子句:
SELECT * FROM
(
SELECT TeacherID, RollNo, Total_Absency FROM mytable
)
PIVOT
(
MAX(Total_Absency)
FOR TeacherID
IN ( 'PNT', 'SGP', 'DAP' )
)
ORDER BY RollNo
ROLLNO | 'PNT' | 'SGP' | 'DAP'
-----: | ----: | ----: | ----:
1 | 0 | 2 | 1
2 | 4 | 1 | 1
3 | 0 | 1 | 1
4 | 1 | 1 | 0
对于其他 RDBMS,一般的解决方案是使用条件聚合:
SELECT
RollNo,
MAX(CASE WHEN TeacherID = 'PNT' THEN Total_Absency END) AS PNT,
MAX(CASE WHEN TeacherID = 'SGP' THEN Total_Absency END) AS SGP,
MAX(CASE WHEN TeacherID = 'DAP' THEN Total_Absency END) AS DAP
FROM mytable
GROUP BY RollNo
ORDER BY RollNo
我的考勤目录Table如下,
如上图所示, class 中有 4 名学生的卷号为 1、2、3、4。 名为 PNT、SGP 和 DAP 的三位老师在相应的讲座时参加了相同的 class。 以上 table 显示了每个学生相对于每个老师的总缺勤情况。
我想生成如下输出,
这table说明每个学生在相应老师的课下的总缺席情况。
如何从给定的 table 得到这样的结果?
DDL 和示例数据:
create table mytable ( TeacherID varchar(3), RollNo number, Total_Absency number);
insert into mytable values('PNT', 1, 0);
insert into mytable values('PNT', 2, 4);
insert into mytable values('PNT', 3, 0);
insert into mytable values('PNT', 4, 1);
insert into mytable values('SGP', 1, 2);
insert into mytable values('SGP', 2, 1);
insert into mytable values('SGP', 3, 1);
insert into mytable values('SGP', 4, 1);
insert into mytable values('DAP', 1, 1);
insert into mytable values('DAP', 2, 1);
insert into mytable values('DAP', 3, 1);
insert into mytable values('DAP', 4, 0);
对于 Oracle,使用 PIVOT
子句:
SELECT * FROM
(
SELECT TeacherID, RollNo, Total_Absency FROM mytable
)
PIVOT
(
MAX(Total_Absency)
FOR TeacherID
IN ( 'PNT', 'SGP', 'DAP' )
)
ORDER BY RollNo
ROLLNO | 'PNT' | 'SGP' | 'DAP' -----: | ----: | ----: | ----: 1 | 0 | 2 | 1 2 | 4 | 1 | 1 3 | 0 | 1 | 1 4 | 1 | 1 | 0
对于其他 RDBMS,一般的解决方案是使用条件聚合:
SELECT
RollNo,
MAX(CASE WHEN TeacherID = 'PNT' THEN Total_Absency END) AS PNT,
MAX(CASE WHEN TeacherID = 'SGP' THEN Total_Absency END) AS SGP,
MAX(CASE WHEN TeacherID = 'DAP' THEN Total_Absency END) AS DAP
FROM mytable
GROUP BY RollNo
ORDER BY RollNo