正在學習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條??梢韵葎h除該條,記錄是按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)    
整理中