sql语句练习(2)

来源:互联网 发布:最悲惨的人生 知乎 编辑:程序博客网 时间:2024/05/07 04:00

1.请用一个sql语句得出结果
从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)

部门dep 一月份      二月份      三月份
--------------------------------------
      01      10        null      null
      02      10         8        null
      03      null       5        8
      04      null      null      9

------------------------------------------


select table2.部门名称dname,sum(case when table1.月份mon='一月份' then table1.业绩yj else 0 end) as '一月份' 
from table1 ,table2  
where table1.部门dep=table2.部门dep 
group by table2.部门名称dname;

+---------------+--------+
| 部门名称dname | 一月份 |
+---------------+--------+
| 国内业务一部  |     10 |
| 国内业务三部  |     10 |
| 国内业务二部  |     10 |
| 国内业务四部  |      0 |
+---------------+--------+

2.华为一道面试题
一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数。

select A, count(*) 

om td2 

group by A 

 having count(*)>1;

表形式如下: 
Year      Salary 
2000        1000 
2001        2000 
2002        3000 
2003        4000 
想得到如下形式的查询结果 
Year      Salary 
2000      1000 
2001      3000 
2002      6000 
2003      10000 
sql语句怎么写? 
select A, count(A) from td2 group by A  having count(A)>1;


3、用一条SQL语句查询出每门课都大于80分的学生姓名

name   kecheng   fenshu
张三     语文       81
张三     数学
       75
李四     语文
       76
李四     数学
       90
王五     语文
       81
王五     数学
       100
王五     英语
       90

mysql> insert into stu(name,kecheng,fenshu) values('张珊','语文',81);Query OK, 1 row affectedmysql> insert into stu(name,kecheng,fenshu) values('张珊','数学',75);Query OK, 1 row affectedmysql> insert into stu(name,kecheng,fenshu) values('李四','语文',76);Query OK, 1 row affectedmysql> insert into stu(name,kecheng,fenshu) values('李四','数学',90);Query OK, 1 row affectedmysql> insert into stu(name,kecheng,fenshu) values('王五','数学',90);Query OK, 1 row affectedmysql> insert into stu(name,kecheng,fenshu) values('王五','语文',90);Query OK, 1 row affectedmysql> insert into stu(name,kecheng,fenshu) values('王五','英语',90);Query OK, 1 row affectedmysql> select * from stu;+------+---------+--------+| name | kecheng | fenshu |+------+---------+--------+| 张珊 | 语文    |     81 || 张珊 | 数学    |     75 || 李四 | 语文    |     76 || 李四 | 数学    |     90 || 王五 | 数学    |     90 || 王五 | 语文    |     90 || 王五 | 英语    |     90 |+------+---------+--------+7 rows in setmysql> 
mysql> select distinct name from stu where name not in (select distinct name from stu where fenshu<80);+------+| name |+------+| 王五 |+------+1 row in set
4.学生表 如下:
自动编号   学号   姓名课程编号课程名称分数

       2005001 张三 0001      数学    69
       2005002 李四 0001      数学
    89
       2005001 张三 0001      数学
    69
删除除了自动编号不同,其他都相同的学生冗余信息

  delete tablename where 自动编号 not in(select min(自动编号) from tablename group by 学号,姓名,课程编号,课程名称,分数)

 delete from stu where name not in
(select a.name 
 from (select name from stu) a//只有mySql需要通过中间表转一下,否则会报错。);
错误信息:
You can't specify target table 'stu' for update in FROM clause

5.请用SQL语句实现:从TestDB数据表中查询出所有月份的发生额都比101科目相应月份的发生额高的科目。请注意:TestDB中有很多科目,都有1-12月份的发生额。
AccID:科目代码,Occmonth:发生额月份,DebitOccur:发生额。
数据库名:JcyAudit,数据集:Select * from TestDB

答:select a.*
from TestDB a
,(select Occmonth,max(DebitOccur) Debit101ccur from TestDB where AccID='101' group by Occmonth) b
where a.Occmonth=b.Occmonth and a.DebitOccur>b.Debit101ccur

6

面试题:怎么把这样一个表儿
year   month amount

1991   1     1.1
1991   2     1.2
1991   3     1.3
1991   4     1.4
1992   1     2.1
1992   2     2.2
1992   3     2.3
1992   4     2.4
查成这样一个结果
year m1   m2   m3   m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4

答案一、
select year,
(select amount from   aaa m where month=1   and m.year=aaa.year) as m1,
(select amount from   aaa m where month=2   and m.year=aaa.year) as m2,
(select amount from   aaa m where month=3   and m.year=aaa.year) as m3,
(select amount from   aaa m where month=4   and m.year=aaa.year) as m4
from aaa   group by year

 

这个是ORACLE  中做的:
select * from (select name, year b1, lead(year) over
(partition by name order by year) b2, lead(m,2) over(partition by name order by year) b3,rank()over(
partition by name order by year) rk from t) where rk=1;



/* 行转列之后又求平均分 问题:在上述结果的基础上加平均分,总分,得到如下结果:  姓名 语文 数学 物理 平均分 总分   ---- ---- ---- ---- ------ ----  李四 74   84   94   84.00  252  张三 74   83   93   83.33  250  */    --SQL SERVER 2000 静态SQL。  select 姓名 姓名,    max(case 课程 when '语文' then 分数 else 0 end) 语文,    max(case 课程 when '数学' then 分数 else 0 end) 数学,    max(case 课程 when '物理' then 分数 else 0 end) 物理,    cast(avg(分数*1.0) as decimal(18,2)) 平均分,    sum(分数) 总分  from tb  group by 姓名 



0 0