欢迎光临
我们一直在努力

Sql Server 整理收集-数据库专栏,SQL Server

建站超值云服务器,限时71元/月

正在学习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.date1<b.date2 and a.date2>b.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)<date2

        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)<a.date2

       and (a.date1 between date1 and date2)

       and abs(datediff(minute,a.date1,date2))>=60)   

整理中

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » Sql Server 整理收集-数据库专栏,SQL Server
分享到: 更多 (0)

相关推荐

  • 暂无文章