Sql Server 整理收集
来源:百度文库 编辑:神马文学网 时间:2024/04/28 01:46:08
[日期:2005-07-08]来源:CSDN 作者:[字体:大中小]
正在学习SQL Server 期望收集一些常见的Sql Server 问题
Sql Server问题摘要
1. 合并若干个表?
描述:建立一个新表,其字段结构是其他若干个表Join以后的结果。
解决思路:select * into 新表名 from 旧表1名,旧表2名,……
实例:
--表NewTableName的字段为表titles和titleauthor字段表相加;
---记录为记录为select * from titles,titleauthor的记录
select * into NewTableName from titles,titleauthor
--表NewTableName的字段[title_id,title,au_id]
-- 记录为select a.title_id,a.title,b.au_id from titles a,titleauthor b where a.title_id=b.title_id
select a.title_id,a.title,b.au_id into NewTableName from titles a,titleauthor b where a.title_id=b.title_id
2. 查询N-M条记录?
描述:要从记录集中取出中间一段记录来(如: 取10条中的第3-8条)
解决思路:
1. 有关键字或确保唯一的候选关键字字段:
方法1:从第n条记录开始取m-n+1条数据
方法2:升序取前m条记录最为a, 再降序从a中取m-n+1条记录作为b
2. 没有上述字段:
增加一个自增字段生成一个临时表,在从临时表中取记录[Where 自增字段名>n-1]
实例: --
--取第4到第7条记录 [对1方法一]
SELECT top 4 * FROM jobs WHERE job_id not in (SELECT top 3 job_id FROM jobs)
--[方法二]
SELECT top 4 * FROM
(SELECT top 4 * FROM
(SELECT top 7 * FROM jobs ORDER BY job_id ASC) a
ORDER BY job_id DESC
) b
ORDER BY job_id ASC
--取第2到第3条记录 [对1方法一]
select IDENTITY(int,1,1) as iid,* into #temptable from discounts select top 2 * from #temptable where iid>=2
3. 按年度季度统计汇总?
描述: 统计表employee的各年度各季度的雇佣人数
解决思路:Group by 和 [函数datepart()]
实例:
//季度:quarter
SELECT year(hire_date) 年度,datepart(q,hire_date) 季度,count(emp_id)雇佣人数 FROM employee
GROUP BY year(hire_date),datepart(q,hire_date)
ORDER BY 年度,季度
4. 随机取n条记录?
描述: 从表中随机提取n条记录
解决思路:按照用Guid
实例:
--从表中随机取5条记录
SELECT top 5 * FROM titles ORDER BY newid()
5. 求出任意时间所在季度的天数?
描述: 如题
解决思路:注意闰年
实例:
declare @t smalldatetime
select @t = ‘2001-4-1‘
select case datepart(quarter,@t)
when 1 then
(case when (year(@t)%4=0 and year(@t)%100<>0) or year(@t)%400=0 then 91 else 90 end)
when 2 then 91
when 3 then 92
when 4 then 92
end
6. 求出任意时间的季度的第一天?
描述: 如题
解决思路: 如下
实例:
-- [思路:把日期向前推到季度的第一个月的当前号
--注意:5月31号不会推成4月31号 ,系统自动转为30号
declare @d datetime
set @d=‘2003-5-31‘
select @d as 指定日期,
dateadd(month,-(month(@d)-1)%3,@d)-day(dateadd(month,-(month(@d)-1)%3,@d))+1 as 季度的第一天
-- [思路:分别求出年月日在转为日期型]
declare @t smalldatetime
select @t = ‘2001-9-30‘
select cast(cast(year(@t) as varchar) + ‘-‘ + cast(3*datepart(q,@t)-2 as varchar) + ‘-1‘ as datetime)
--求当前的日期季度的第一天
select cast(cast(year(getdate()) as varchar) + ‘-‘ + cast(3*datepart(q,getdate())-2 as varchar) + ‘-1‘ as datetime)
7. 时间重叠度的问题?
出处:http://expert.csdn.net/Expert/topic/2806/2806966.xml?temp=.5277979
描述:
create table #a(id int identity(1,1),date1 datetime,date2 datetime)
insert #a select ‘2004-02-29 16:45:00‘,‘2004-02-29 20:45:00‘
union all select ‘2004-02-29 18:45:00‘,‘2004-02-29 22:45:00‘
union all select ‘2004-03-01 10:45:00‘,‘2004-03-01 13:45:00‘
union all select ‘2004-03-01 13:45:00‘,‘2004-03-01 16:45:00‘
union all select ‘2004-03-01 13:47:00‘,‘2004-03-01 14:25:00‘
union all select ‘2004-03-01 16:45:00‘,‘2004-03-01 19:15:00‘
union all select ‘2004-03-01 17:45:00‘,‘2004-03-01 18:55:00‘
union all select ‘2004-03-01 18:45:00‘,‘2004-03-01 21:45:00‘
select *from #a
我现在要找出时间上重叠超过1个小时的所有记录!
比如第1、2条:一个是从16:45---20:45,第二条是从18:45---22:45时间上重叠了2个小时,所以这两条都要取出,其它的也是一样的规则!
date2-date1小于1小时的不用考虑,如第5条。可以先删除该条,记录是按date1排序的!
所以最终的结果要为:
id date1 date2
----------- --------------------------- ---------------------------
1 2004-02-29 16:45:00.000 2004-02-29 20:45:00.000
2 2004-02-29 18:45:00.000 2004-02-29 22:45:00.000
6 2004-03-01 16:45:00.000 2004-03-01 19:15:00.000
7 2004-03-01 17:45:00.000 2004-03-01 18:55:00.000
解决思路:
实例:
--方案一:[作者:“victorycyz(中海,干活去了,不在CSDN玩。)”]
select distinct a.*
from #a a , #a b
where a.id<>b.id and
a.date1b.date1 and
(case when a.date2>b.date2 then b.date2 else a.date2 end)-
(case when a.date1>b.date1 then a.date1 else b.date1 end)>1/24.0
--方案二:[作者:“j9988(j9988)”]
select * from #a A where
exists(select 1 from #a
where id<>A.id
and dateadd(minute,60,date1)
and (date1 between A.date1 and A.date2)
and abs(datediff(minute,date1,A.date2))>=60)
or
exists(select 1
from #a
where id<>A.id
and dateadd(minute,60,A.date1)
and (A.date1 between date1 and date2)
and abs(datediff(minute,A.date1,date2))>=60)
正在学习SQL Server 期望收集一些常见的Sql Server 问题
Sql Server问题摘要
1. 合并若干个表?
描述:建立一个新表,其字段结构是其他若干个表Join以后的结果。
解决思路:select * into 新表名 from 旧表1名,旧表2名,……
实例:
--表NewTableName的字段为表titles和titleauthor字段表相加;
---记录为记录为select * from titles,titleauthor的记录
select * into NewTableName from titles,titleauthor
--表NewTableName的字段[title_id,title,au_id]
-- 记录为select a.title_id,a.title,b.au_id from titles a,titleauthor b where a.title_id=b.title_id
select a.title_id,a.title,b.au_id into NewTableName from titles a,titleauthor b where a.title_id=b.title_id
2. 查询N-M条记录?
描述:要从记录集中取出中间一段记录来(如: 取10条中的第3-8条)
解决思路:
1. 有关键字或确保唯一的候选关键字字段:
方法1:从第n条记录开始取m-n+1条数据
方法2:升序取前m条记录最为a, 再降序从a中取m-n+1条记录作为b
2. 没有上述字段:
增加一个自增字段生成一个临时表,在从临时表中取记录[Where 自增字段名>n-1]
实例: --
--取第4到第7条记录 [对1方法一]
SELECT top 4 * FROM jobs WHERE job_id not in (SELECT top 3 job_id FROM jobs)
--[方法二]
SELECT top 4 * FROM
(SELECT top 4 * FROM
(SELECT top 7 * FROM jobs ORDER BY job_id ASC) a
ORDER BY job_id DESC
) b
ORDER BY job_id ASC
--取第2到第3条记录 [对1方法一]
select IDENTITY(int,1,1) as iid,* into #temptable from discounts select top 2 * from #temptable where iid>=2
3. 按年度季度统计汇总?
描述: 统计表employee的各年度各季度的雇佣人数
解决思路:Group by 和 [函数datepart()]
实例:
//季度:quarter
SELECT year(hire_date) 年度,datepart(q,hire_date) 季度,count(emp_id)雇佣人数 FROM employee
GROUP BY year(hire_date),datepart(q,hire_date)
ORDER BY 年度,季度
4. 随机取n条记录?
描述: 从表中随机提取n条记录
解决思路:按照用Guid
实例:
--从表中随机取5条记录
SELECT top 5 * FROM titles ORDER BY newid()
5. 求出任意时间所在季度的天数?
描述: 如题
解决思路:注意闰年
实例:
declare @t smalldatetime
select @t = ‘2001-4-1‘
select case datepart(quarter,@t)
when 1 then
(case when (year(@t)%4=0 and year(@t)%100<>0) or year(@t)%400=0 then 91 else 90 end)
when 2 then 91
when 3 then 92
when 4 then 92
end
6. 求出任意时间的季度的第一天?
描述: 如题
解决思路: 如下
实例:
-- [思路:把日期向前推到季度的第一个月的当前号
--注意:5月31号不会推成4月31号 ,系统自动转为30号
declare @d datetime
set @d=‘2003-5-31‘
select @d as 指定日期,
dateadd(month,-(month(@d)-1)%3,@d)-day(dateadd(month,-(month(@d)-1)%3,@d))+1 as 季度的第一天
-- [思路:分别求出年月日在转为日期型]
declare @t smalldatetime
select @t = ‘2001-9-30‘
select cast(cast(year(@t) as varchar) + ‘-‘ + cast(3*datepart(q,@t)-2 as varchar) + ‘-1‘ as datetime)
--求当前的日期季度的第一天
select cast(cast(year(getdate()) as varchar) + ‘-‘ + cast(3*datepart(q,getdate())-2 as varchar) + ‘-1‘ as datetime)
7. 时间重叠度的问题?
出处:http://expert.csdn.net/Expert/topic/2806/2806966.xml?temp=.5277979
描述:
create table #a(id int identity(1,1),date1 datetime,date2 datetime)
insert #a select ‘2004-02-29 16:45:00‘,‘2004-02-29 20:45:00‘
union all select ‘2004-02-29 18:45:00‘,‘2004-02-29 22:45:00‘
union all select ‘2004-03-01 10:45:00‘,‘2004-03-01 13:45:00‘
union all select ‘2004-03-01 13:45:00‘,‘2004-03-01 16:45:00‘
union all select ‘2004-03-01 13:47:00‘,‘2004-03-01 14:25:00‘
union all select ‘2004-03-01 16:45:00‘,‘2004-03-01 19:15:00‘
union all select ‘2004-03-01 17:45:00‘,‘2004-03-01 18:55:00‘
union all select ‘2004-03-01 18:45:00‘,‘2004-03-01 21:45:00‘
select *from #a
我现在要找出时间上重叠超过1个小时的所有记录!
比如第1、2条:一个是从16:45---20:45,第二条是从18:45---22:45时间上重叠了2个小时,所以这两条都要取出,其它的也是一样的规则!
date2-date1小于1小时的不用考虑,如第5条。可以先删除该条,记录是按date1排序的!
所以最终的结果要为:
id date1 date2
----------- --------------------------- ---------------------------
1 2004-02-29 16:45:00.000 2004-02-29 20:45:00.000
2 2004-02-29 18:45:00.000 2004-02-29 22:45:00.000
6 2004-03-01 16:45:00.000 2004-03-01 19:15:00.000
7 2004-03-01 17:45:00.000 2004-03-01 18:55:00.000
解决思路:
实例:
--方案一:[作者:“victorycyz(中海,干活去了,不在CSDN玩。)”]
select distinct a.*
from #a a , #a b
where a.id<>b.id and
a.date1b.date1 and
(case when a.date2>b.date2 then b.date2 else a.date2 end)-
(case when a.date1>b.date1 then a.date1 else b.date1 end)>1/24.0
--方案二:[作者:“j9988(j9988)”]
select * from #a A where
exists(select 1 from #a
where id<>A.id
and dateadd(minute,60,date1)
and (date1 between A.date1 and A.date2)
and abs(datediff(minute,date1,A.date2))>=60)
or
exists(select 1
from #a
where id<>A.id
and dateadd(minute,60,A.date1)
and (A.date1 between date1 and date2)
and abs(datediff(minute,A.date1,date2))>=60)
Sql Server 整理收集
Sql Server 整理收集
sql server
SQL Server:用 SQL 语句
SQL Server日期计算
Sql Server 常用函数
SQL SERVER实用技巧
SQL Server日期计算
SQL Server基本函数
SQL Server专题
SQL Server日期计算
Sql Server 版本问题
SQL Server缺省数据库
SQL Server笔试题
SQL Server笔试题
SQL Server DATEADD() 函数
sql server DBCC SHOWCONTIG
sql server回滚
SQL Server Configuration Manager
SQL SERVER 数据类型详解
sql server 使用技巧
SQL Server 2008 setup
Sql Server锁表
SQL概述For SQL Server Compact Edition