一道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的用法和括号里的语句编写*/