zoukankan      html  css  js  c++  java
  • sql练手

    最近发现自己写sql不熟练,花些时间强化练习,下面是我在博客园里找的题,都自己做了遍:

    1.一道SQL语句面试题,关于group by
    表内容:
    小王 胜
    小王 胜
    小王 负
    小王 负
    小张 胜
    小张 负
    小张 负

    如果要生成下列结果, 该如何写sql语句?

        胜 负
    小王 2 2
    小张 1 2
    ------------------------------------------

    构建题目:
    create table #chase(name varchar(10),result nchar(1))
    insert into #chase values('小王','胜')
    insert into #chase values('小王','胜')
    insert into #chase values('小王','负')
    insert into #chase values('小王','负')
    insert into #chase values('小张','胜')
    insert into #chase values('小张','负')
    insert into #chase values('小张','负')

    我的答案:

    Code
    select a.aname,a.胜局,b.负局 
        
    from (select name aname,count(result) as 胜局 from chase
            
    where result=''
        
    group by name) as a
    inner join
    (
    select name bname,count(result) as 负局 from chase
        
    where result=''
            
    group by name) as b
    on 
    a.aname
    =b.bname

    答案2:

    Code
    select name, sum(case when result='' then 1 else 0 end)胜局,sum(case when result='' then 1 else 0 end)负局
    from chase
    group by name

    结果:

    2.请教一个面试中遇到的SQL语句的查询问题
    表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
    ------------------------------------------
    select (case when a>b then a else b end ),
    (case when b>c then b esle c end)
    from table_name

    3.有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):  
       大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。  
           显示格式:  
           语文              数学                英语  
           及格              优秀                不及格
     

    构建题目:

    Code
    create table #tempTable (语文 nvarchar(50NULL,数学 nvarchar(50NULL,英语 nvarchar(50NULL)
    insert into #tempTable(语文,数学,英语)values('60','50','90')

    我的答案:

    Code
    select (case When 语文<60 then '不及格'
             
    when 语文 >= 60 and 语文 <79 then '及格'
             
    when 语文>79 then '优秀'
            
    end
            )语文,(
    case When 数学<60 then '不及格'
             
    when 数学 > 60 and 数学 <79 then '及格'
             
    when 数学>79 then '优秀'
            
    end
            )数学,(
    case When 英语<60 then '不及格'
              
    when 英语 > 60 and 英语 <79 then '及格'
              
    when 英语>79 then '优秀'
            
    end
            )英语
    from #tempTable

    结果:

    4.请用一个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

    ------------------------------------------
    构建表:

    Code
    create table #YEJI (mon nvarchar(50NULL,dep nvarchar(50NULL,yj nvarchar(50NULL)
    insert into #YEJI(mon,dep,yj)values('一月份','01','10')
    insert into #YEJI(mon,dep,yj)values('一月份','02','10')
    insert into #YEJI(mon,dep,yj)values('一月份','03','5')
    insert into #YEJI(mon,dep,yj)values('二月份','02','8')
    insert into #YEJI(mon,dep,yj)values('二月份','04','9')
    insert into #YEJI(mon,dep,yj)values('三月份','03','8')

    select * from #YEJI

    create table #DPT (depID nvarchar(50NULL,depName nvarchar(50NULL)
    insert into #DPT(depID,depName)values('01','国内业务一部')
    insert into #DPT(depID,depName)values('02','国内业务二部')
    insert into #DPT(depID,depName)values('03','国内业务三部')
    insert into #DPT(depID,depName)values('04','国际业务部')

    我的答案:

    Code
    SELECT DEPID,(select yj from #YEJI where mon='一月份' and #YEJI.dep=DEPID) as 一月,
    (
    select yj from #YEJI where mon='二月份' and #YEJI.dep=DEPID) as 二月
    ,(
    select yj from #YEJI where mon='三月份' and #YEJI.dep=DEPID) as 三月
    ,(
    select yj from #YEJI where mon='四月份' and #YEJI.dep=DEPID) as 四月 
    FROM #DPT 

    结果:


     

    5。要求:设计一个查询,返回结果如下:

    ID 日期 单据
    ---------- ----------- ---
    1 2004-08-02 001
    4 2004-09-02 002

    即对于每个单据号,返回日期最小的行。

    Code
    CREATE TABLE #表 
    (ID 
    int, 日期 varchar(11), 单据 char(3))
    INSERT INTO #表 (ID , 日期 , 单据 ) VALUES ( 1 , '2004-08-02' , '001' );
    INSERT INTO #表 (ID , 日期 , 单据 ) VALUES ( 2 , '2004-09-02' , '001' );
    INSERT INTO #表 (ID , 日期 , 单据 ) VALUES ( 3 , '2004-10-02' , '002' );
    INSERT INTO #表 (ID , 日期 , 单据 ) VALUES ( 4 , '2004-09-02' , '002' );

    select * from #表

    select b.id,a.单据,a.minD from
    (
    select 单据,min(日期) minD from #表 group by 单据) as a
    left join 
    #表 b
    on
    a.minD
    =b.日期
    and a.单据 =b.单据

    select a.* from #表 a where 
    a.日期 
    in (select min(日期) from #表 b where b.单据=a.单据 )

    方法二、方法三:

    Code

    select * from #表 a
    where  a.日期< any(select 日期 from #表 where 单据=a.单据 ) 

    select * from #表 a
    not exsit (select 1 from #表 where 单据=a.单据 and 日期<a。日期 )

    结果:

     

      

     

    Code
    create table #tTable
    (
    productid 
    int,
    productname 
    varchar(10),
    PARENTID 
    INT,
    clicknum 
    int
    )

    INSERT INTO #tTable(productid,productname,PARENTID,clicknum)
    VALUES(1,'男士衣服','1',90)
    INSERT INTO #tTable(productid,productname,PARENTID,clicknum)
    VALUES(2,'女士衣服','1',80)
    INSERT INTO #tTable(productid,productname,PARENTID,clicknum)
    VALUES(3,'男士裤子','2',70)
    INSERT INTO #tTable(productid,productname,PARENTID,clicknum)
    VALUES(4,'女士裤子','2',90)
    INSERT INTO #tTable(productid,productname,PARENTID,clicknum)
    VALUES(5,'男士帽子','5',15)
    INSERT INTO #tTable(productid,productname,PARENTID,clicknum)
    VALUES(6,'女士帽子','5',30)
    INSERT INTO #tTable(productid,productname,PARENTID,clicknum)
    VALUES(7,'男士鞋子','10',65)
    INSERT INTO #tTable(productid,productname,PARENTID,clicknum)
    VALUES(8,'女士鞋子','10',52)
    INSERT INTO #tTable(productid,productname,PARENTID,clicknum)
    VALUES(9,'女士鞋子1','10',54)

    SELECT * FROM #tTable

    SELECT PARENTID,MAX(CLICKNUM) FROM #tTable GROUP BY PARENTID

    SELECT * FROM #tTable A WHERE CLICKNUM IN (SELECT MAX(CLICKNUM) FROM #tTable  WHERE PARENTID=A.PARENTID )
  • 相关阅读:
    Android之上下文context
    如果简单的记录,就可以为这个世界创造更多的财富,那么还有什么理由不去写博客呢? — 读<<黑客与画家>> 有感
    【最新最全】为 iOS 和 Android 的真机和模拟器编译 Luajit 库
    【Graphql实践】使用 Apollo(iOS) 访问 Github 的 Graphql API
    【最新】LuaJIT 32/64 位字节码,从编译到使用全纪录
    简陋的swift carthage copy-frameworks 辅助脚本
    【自问自答】关于 Swift 的几个疑问
    【读书笔记】The Swift Programming Language (Swift 4.0.3)
    【读书笔记】A Swift Tour
    【趣味连载】攻城狮上传视频与普通人上传视频:(一)生成结构化数据
  • 原文地址:https://www.cnblogs.com/shineqiujuan/p/1436548.html
Copyright © 2011-2022 走看看