MSSQL笔试题

一道MSSQL笔试题 

有一组通话记录,数据量较大。信息表结构如下:
ID 主叫号码 被叫号码通话起始时间   通话结束时间           通话时长

其中ID为主键
求其中同一个号码的两次通话之间间隔大于某个时间的通话记录ID 。不妨设时间间隔为2分钟

一、

select distinct id
from tb t
where id in (select id from tb where [主叫号码]=t.[主叫号码] and (datediff(minute,t.[通话起始时间],[通话结束时间])>=2))
or id=(case when (select count(*) from tb where [主叫号码]=t.[主叫号码] and (datediff(minute,t.[通话起始时间],[通话结束时间])>=2))>0 then id else 0 end)

二、

select t.id as '首次主叫ID'
 ,b.id as '下次叫ID'
from tb t
inner join tb b
on t.[主叫号码]=b.[主叫号码]
and datediff(minute,t.[通话起始时间],b.[通话结束时间])>2
and t.id<>b.id


希望大家奉献更好的方法。共同学习,不胜感激。

 

A             B     C     D  
  2001     01     1     200  
  2001     02     2     300  
  2001     05     4     400  
  2002     01     1     10  
  2002     05     2     100  
   
  编写SQL语句使上表变成  
  A           01     02     05  
  2001   200     150   100              
  2002     10               50

 

 


 笔试题目
 
 
自己在SQL Server中建立一个数据库(或利用现有数据库),再建立下表。
SQL Server中表test:


CREATE  TABLE  test( 
               Code          smallint  NOT  NULL,                --学生编号 
               Name          varchar(10)  NOT  NULL,          --学生姓名 
               Lessons    varchar(1000)  NOT  NULL,      --课程名称,每个名称以“,”结束 
               Score1      varchar(1000)  NOT  NULL,      --期中成绩,每课程成绩以“,”结束 
               Score2      varchar(1000)  NOT  NULL,      --期末成绩,每课程成绩以“,”结束 
 
               PRIMARY  KEY  (Code) 

go
 

实例记录数据:


insert  into  test  (Code,Name,Lessons,Score1,Score2)  values(20301,'张三','语文,数学 
,外语,','100,99,98,','97,96,95,') 
go 
insert  into  test  (Code,Name,Lessons,Score1,Score2)  values(20302,'李四','语文,数学 
,外语,','90,89,88,','87,86,85,') 
go 
insert  into  test  (Code,Name,Lessons,Score1,Score2)  values(20303,'王五','语文,数学 
,外语,','70,69,68,','67,66,65,') 
go
 

屏幕显示实例:


编号   姓名    期中    期末    期中    期末     期中    期末
课程 20301   张三    100      97       99      96       98      95 
语文 20302   李四     90      87       89      86       88      85     
数学 20302   李四     90      87       89      86       88      85   
外语 20303   王五     70      67       69      66       68      65
 

题目的难点在于科目是动态的

陶清网站已经有人用sql实现了

他说没有用到游标只用了一个函数

函数已经给出

但后面的具体实现过程他没有提供

还请csdn上的高手们赐教

谢谢


drop  table  test 
go 
drop  table  #t 
go 
CREATE  TABLE  test( 
               Code          smallint  NOT  NULL,                --学生编号 
               Name          varchar(10)  NOT  NULL,          --学生姓名 
               Lessons    varchar(1000)  NOT  NULL,      --课程名称,每个名称以“,”结束 
               Score1      varchar(1000)  NOT  NULL,      --期中成绩,每课程成绩以“,”结束 
               Score2      varchar(1000)  NOT  NULL,      --期末成绩,每课程成绩以“,”结束 
 
               PRIMARY  KEY  (Code) 

go 
 
insert  into  test  (Code,Name,Lessons,Score1,Score2)  values(20301,'张三','语文,数学 
,外语,','100,99,98,','97,96,95,') 
go 
insert  into  test  (Code,Name,Lessons,Score1,Score2)  values(20302,'李四','语文,数学 
,外语,','90,89,88,','87,86,85,') 
go 
insert  into  test  (Code,Name,Lessons,Score1,Score2)  values(20303,'王五','语文,数学 
,外语,','70,69,68,','67,66,65,') 
go 
/*
 

屏幕显示实例:


编号   姓名    期中    期末    期中    期末     期中    期末
课程 20301   张三    100      97       99      96       98      95 
语文 20302   李四     90      87       89      86       88      85     
数学 20302   李四     90      87       89      86       88      85   
外语 20303   王五     70      67       69      66       68      65
 

*/


create  table  #t( 
               Code          smallint  NOT  NULL,                --学生编号 
               Name          varchar(10)  NOT  NULL,          --学生姓名 
               Lessons    varchar(100)  NOT  NULL,      --课程名称,每个名称以“,”结束 
               Score1      int, 
               Score2      int 

go 
Select  1 
while  @@rowcount  >  0 
begin 
           insert  #t   
           select  code,name 
           ,left(lessons,charindex(',',lessons)-1)   
           ,left(score1,charindex(',',score1)-1) 
           ,left(score2,charindex(',',score2)-1) 
           from  test 
           where  charindex(',',lessons)>0 
 
           update  test  set  lessons  =  right(lessons,len(lessons)-charindex(',',lessons)),   
           score1  =  right(score1,len(score1)-charindex(',',score1))  , 
           score2  =  right(score2,len(score2)-charindex(',',score2))   
           where  charindex(',',lessons)>0 
end 
 
 
declare  @sql  varchar(8000) 
set  @sql  =  'select  code,name' 
select  @sql  =  @sql  +  ',sum(case  lessons  when  '''+lessons+'''  then  cast
(score1
 as  int)  end)  ['+rtrim(lessons)+'中]' 
+  ',sum(case  lessons  when  '''+lessons+'''  then  cast
(score2  as  int)  end)  ['+rtrim(lessons)+'末]' 
 from  (select  distinct  lessons  as  lessons  from  #t)  as  a 
select  @sql  =  @sql+'  from  #t  group  by  code,name' 
exec(@sql) 
 
 
code    name  数学中    数学末    外语中    外语末    语文中   语文末             
20302    李四   89        86       88         85        90       87 
20303    王五   69        66       68         65        70       67 
20301    张三   99        96       98         95       100       97
 
 

 

联通笔试题,写给大家参考一下

     表中内容                   查询结果         
   a    9     10              a    9    45
   b    9     15              b    9    40
   c    9     20              c    9    35
   d    9     10              d    9    45
   a    9.5   30              a    9.5  45
   b    9.5   20              b    9.5  55
   c    9.5   10              c    9.5  65
   d    9.5   15              d    9.5  60
   a    9.8   15              a    9.8  75
   b    9.8   20              b    9.8  70
   c    9.8   30              c    9.8  60
   d    9.8   25              d    9.8  65

 


数据库笔试题<SQL-Server>2007年03月15日 星期四 10:48<1>在SQL Server数据库中,在Products表中查询最贵的产品名称和价格,正确的SQL语句为:

SELECT Productname,Price FROM Products WHERE Price =(SELECT MAX(Price) FROM Products)

<2>删除在Orders 定单表中所有超过3年的老定单,正确的SQL语句为:

DELETE FROM Orders WHERE OrdersDate < DATEADD(YYYY,-3,GETDATE())

<3>什么是触发器?SQL Server 2000有什么不同类型的触发器?

KEY:触发器是一种专用类型的存储过程,它被捆绑到SQL Server 2000的表格或者视图上。在SQLServer

2000里,有INSTEAD-OF和AFTER两造触发器。INSTEAD-OF触发器是替代数据操控语言(Data Manipulation

Language,DML)语句对表格执行语句的存储过程。例如:如果我有一个用于Table1的INSTEAD-OF-UPDATE触发

器,同时对这个表格执行一个更新语句,那么INSTEAD-OF-UPDATE触发器里的代码会执行,而不是我执行的更新

语句则不会执行操作。AFTER触发器要在DML语句在数据库里使用之后才执行。这些类型的触发器对于监视发生

在数据库表格里的数据变化十分好用。

<4>怎样获得所有数据库清单?


select name from master..sysdatabases

 

<5>这样获得当前数据库中数据表的清单?


select name from sysobjects where xtype='u' and name!='dtproperties'

<6>查找表中从10行到15行的记录,id 可能不连续 ?

select top 5 * from (select top 15 * from [表] order by id asc) [表] order by [列] desc

<7>随机从表中抽取10条记录?

select top 10 * from [table name] order by newid()

<8>计算出生年月?

DECLARE @BEGINDATE DATETIME
DECLARE @ENDDATE DATETIME
DECLARE @y INT
DECLARE @m INT
DECLARE @d INT
SET @BEGINDATE ='2004-05-15'
SET @ENDDATE = '2007-07-18'

SET @y = DATEDIFF(MM,@BEGINDATE,@ENDDATE)/12 
SET @m = DATEDIFF(MM,@BEGINDATE,@ENDDATE)%12 
SET @d = DATEDIFF(DD,DATEADD(yy,@y,DATEADD(mm,@m,@BEGINDATE)),@ENDDATE)

IF @d < 0 and @m = 0
SELECT @y - 1 AS '年',(12 -1) + @m AS '月',30 + @d AS '日'
ELSE IF @d <0
SELECT @y AS '年',@m - 1 AS '月',30 + @d AS '日'
ELSE
SELECT @y AS '年',@m AS '月',@d AS '日'


<9>区域插入或更新数据

/*假如在31-39条填入20*/
update [table] set KK = '20' where KK in (select top 9 * from (select top 39 * from [table] order by KK asc) [table] order by [KK] desc)
/*[table] 指的是你要查询的表,这里关键在于in的用法和括号里的语句编写*/ 
 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值