表内容:
rq |
shengfu |
2005-05-09 |
胜 |
2005-05-09 |
胜 |
2005-05-09 |
负 |
2005-05-09 |
负 |
2005-05-10 |
胜 |
2005-05-10 |
负 |
2005-05-10 |
负 |
如果要生成下列结果, 该如何写sql语句?
rq |
胜 |
负 |
2005-05-09 |
2 |
2 |
2005-05-10 |
1 |
2 |
--第一种解法: SELECT rq,(SELECT COUNT(1) FROM tbl_shengfu x WHERE x.rq = a.rq AND x.shengfu = '胜') AS 胜,(SELECT COUNT(1) FROM tbl_shengfu y WHERE y.rq = a.rq AND y.shengfu = '负') AS 负 FROM tbl_shengfu a GROUP BY rq; --第二种解法: SELECT rq,SUM(CASE WHEN shengfu = '胜' THEN 1 ELSE 0 END) 胜,SUM(CASE WHEN shengfu = '负' THEN 1 ELSE 0 END) 负 FROM tbl_shengfu GROUP BY rq;
从table1,table2中取出如table3所列格式数据,注意提供的数据及结果不准确,只是作为一个格式向大家请教。
如使用存储过程也可以。
table1
月份mon |
部门dep |
业绩yj |
一月份 |
01 |
10 |
一月份 |
02 |
10 |
一月份 |
03 |
5 |
二月份 |
02 |
8 |
二月份 |
04 |
9 |
三月份 |
03 |
8 |
table2
部门dep |
部门名称dname |
01 |
国内业务一部 |
02 |
国内业务二部 |
03 |
国内业务三部 |
04 |
国际业务部 |
table3 (result)
部门dname |
一月份 |
二月份 |
三月份 |
国内业务一部 |
10 |
null |
null |
国内业务二部 |
10 |
8 |
null |
国内业务三部 |
5 |
null |
8 |
国际业务部 |
null |
9 |
null |
SELECT dname, (SELECT yj FROM dbo.table2 a WHERE a.mon = '一月份' AND a.dep = d.dep) 一月份, (SELECT yj FROM dbo.table2 b WHERE b.mon = '二月份' AND b.dep = d.dep) 二月份, (SELECT yj FROM dbo.table2 c WHERE c.mon = '三月份' AND c.dep = d.dep) 三月份 FROM dbo.table1 d;
表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
SELECT (CASE WHEN a>b THEN a ELSE b END) x,(CASE WHEN b>c THEN b ELSE c END) y FROM tbl;
假设只有一个table,名为pages,有四个字段,id, url,title,body。里面储存了很多网页,网页的url地址,title和网页的内容,然后你用一个sql查询将url匹配的排在最前,title匹配的其次,body匹配最后,没有任何字段匹配的,不返回。
select a.[id],a.mark from ( select [page].[id],100 as mark from [page] where [page].[url] like '%abc%' union select [page].[id],50 as mark from [page] where [page].[title] like '%abc%' union select [page].[id],10 as mark from [page] where [page].[body] like '%abc%' ) as a order by mark DESC
有以下三张表,
Class表
classid |
classname |
1 |
高三(一)班 |
2 |
高三(二)班 |
3 |
高三(三)班 |
Student表
studentid |
studentName |
classid |
1 |
张三 |
2 |
2 |
李四 |
1 |
3 |
王五 |
1 |
4 |
赵六 |
3 |
5 |
钱七 |
2 |
6 |
孙九 |
3 |
score表
scoreid |
course |
studentid |
score |
1 |
数学 |
2 |
99 |
2 |
数学 |
3 |
60 |
3 |
数学 |
4 |
80 |
4 |
语文 |
5 |
79 |
5 |
语文 |
6 |
58 |
6 |
语文 |
1 |
66 |
7 |
英语 |
6 |
76 |
8 |
英语 |
4 |
87 |
9 |
英语 |
3 |
100 |
10 |
英语 |
2 |
69 |
要求:
编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数
--Class create table #class ( classid int, classname nvarchar(20) ) insert into #class select 1,'高三(一)班' union all select 2,'高三(二)班' union all select 3,'高三(三)班'; --Student create table #student ( studentid int, studentname nvarchar(20), classid int ) insert into #student select 1,'张三',2 union all select 2,'李四',1 union all select 3,'王五',1 union all select 4,'赵六',3 union all select 5,'钱七',2 union all select 6,'孙九',3; --Score create table #score ( scoreid int, course nvarchar(20), studentid int, score int ) insert into #score select 1,'数学',2,99 union all select 2,'数学',3,60 union all select 3,'数学',4,80 union all select 4,'语文',5,79 union all select 5,'语文',6,58 union all select 6,'语文',1,66 union all select 7,'英语',6,76 union all select 8,'英语',4,87 union all select 9,'英语',3,100 union all select 10,'英语',2,69; SELECT * FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY className,course ORDER BY score DESC) rn,className,studentName,course,score FROM dbo.#score a,dbo.#student b,dbo.#class c WHERE a.studentId = b.studentId AND b.classId = c.classId) e WHERE e.rn = 1;