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 FROM 表 ORDER 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 FROM 表 ORDER 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