交叉表的写法,主要用Decode和Case来实现,它们的最大区别就是, case应用广泛一些
如何实现交叉表的功能?通过sql语句?
如: 学号 课程 分数
1 数学 99
1 英语 89
1 法律 98
2 数学 100
2 英语 99
2 法律 87
将上述表变为:
学号 数学 英语 法律 1 99 89 98
2 100 99 87
create table stu(学号 number,课程 varchar2(20),分数 number);
insert into stu values(1,'数学',99);
insert into stu values(1,'英语',68);
insert into stu values(2,'法律',79);
insert into stu values(3,'数学',92);
insert into stu values(3,'英语',72);
insert into stu values(4,'法律',96);
select * from stu;
create table student(
学号 number,
姓名 varchar(20)
);
insert into student values(1,'mqian');
insert into student values(2,'hzy');
select s1.学号,s2.姓名,
sum(case 课程 when '数学' then 分数 end)as 数学,
sum(case 课程 when '英语' then 分数 end)as 英语,
sum(case 课程 when '法律' then 分数 end)as 法律,
sum(分数)总分数 from stu s1
join student s2 on s1.学号 =s2.学号 group by s1.学号,s2.姓名
union all
select null,'总分数',
sum(case 课程 when '数学' then 分数 end)as 数学,
sum(case 课程 when '英语' then 分数 end)as 英语,
sum(case 课程 when '法律' then 分数 end)as 法律,
sum(分数)总分数 from stu s1
join student s2 on s1.学号 =s2.学号 ;
select s_name from student;
select * from student;
select * from stu;
drop table student;
--分页语句 select * from (
select rownum r,a.* from (
select * from emp order by emp.hiredate desc ) a ) b
where r between 4 and 6
--另一题目
2009-05-19 胜
2009-05-19 胜
2009-05-19 负
2009-05-20 胜
2009-05-20 负
2009-05-20 胜
2009-05-20 负
-------------------------
sql查询后输出:
--------------------------
胜 负
2009-05-19 2 1
2009-05-20 2 2
CREATE TABLE test1(t_date DATE,t_flag CHAR(2));
SELECT * FROM test1;
SELECT t_date,
COUNT(CASE t_flag WHEN '胜' THEN t_flag END)AS 胜,
COUNT(CASE t_flag WHEN '负' THEN t_flag END)AS 负
FROM test1 GROUP BY t_date;
COMMIT;