Fork me on GitHub

SQL奇技淫巧

1.SQL行列转换

问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果): 
姓名 语文 数学 物理 
---- ---- ---- ----
李四 74 84 94
张三 74 83 93

代码:

select 姓名 as 姓名 ,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名

2.SQL分页

--分页方案一:(利用Not In和SELECT TOP分页) 
语句形式: 
SELECT TOP 10 * FROM TestTable
WHERE (ID NOT IN(SELECT TOP 20 id FROM TestTable ORDER BY id)) 
ORDER BY ID 
 
 
SELECT TOP 页大小 * FROM TestTable 
WHERE (ID NOT IN (SELECT TOP 页大小*页数 id FROMORDER BY id)) 
ORDER BY ID 
 
------------------------------------- 
 
--分页方案二:(利用ID大于多少和SELECT TOP分页) 
语句形式: 
SELECT TOP 10 * FROM TestTable 
WHERE (ID > (SELECT MAX(id) FROM (SELECT TOP 20 id FROM TestTable ORDER BY id) AS T)) 
ORDER BY ID 
 
 
SELECT TOP 页大小 * FROM TestTable 
WHERE (ID > (SELECT MAX(id) FROM (SELECT TOP 页大小*页数 id FROMORDER BY id) AS T)) 
ORDER BY ID 
 
------------------------------------- 
 
--分页方案三:(利用SqlServer2005中的新特性ROW_NUMBER进行分页)
 
Select * FROM (
  select ROW_NUMBER()Over(order by id desc) as rowId,* from TestTable
) as mytable
where rowId between 21 and 40

3.SQL查询结果合并

--合并重复行
select * from A
 union
select * from B
 
--不合并重复行
select * from A
 union all
select * from B

4.SQL随机排序

SELECT * FROM TestTable ORDER BY NEWID()

5.SQL以逗号分隔取两边数据

select charindex(',',',')         --结果是1
select charindex(',','NULL')     --结果是0
select charindex(',','')         --结果是0
select charindex(',','T,ToEstate')    --结果是2
select len('T,ToEstate')               --结果是10
select  len('T,ToEstate') - charindex(',','T,ToEstate')  --结果是10-2=8
select right('T,ToEstate',(len('T,ToEstate') - charindex(',','T,ToEstate'))) --结果是 ToEstate

 

select
case when charindex(',',roomdirection)>1 then  left(roomdirection,charindex(',',roomdirection)-1) else null end as roomdirection1 ,
case when charindex(',',roomdirection)>1 then  right(roomdirection,(len(roomdirection) - charindex(',',roomdirection)))  else null end as roomdirection2
from  tb

 6.WAITFOR延时执行

--WAITFOR
--例 等待1 小时2 分零3 秒后才执行SELECT 语句
waitfor delay '01:02:03'
select * from employee
--例 等到晚上11 点零8 分后才执行SELECT 语句
waitfor time '23:08:00'
select * from employee

 

posted @ 2017-09-05 13:57  神雕爱大侠  阅读(554)  评论(0编辑  收藏  举报