在做报表时,经常需要将数据表中的行转列,或者列转行,如果不知道方法,你会觉得通过SQL语句来实现非常难。这里,我将使用pivot和unpivot来实现看似复杂的功能。
引用MSDN:
可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表。PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换为列值,但是在实际应用中,有些聚合之后的数据很难进行拆分。所以呢,unpivot并非pivot的逆过程。
pivot 提供的语法比一系列复杂的 SELECT...CASE 语句中所指定的语法更简单和更具可读性。
使用SELECT...CASE语句进行行转列的方法见:解析SQL Server中行转列问题
Sql Server中的日期与时间函数
SQL中的时间函数非常有用,特别是在我们进行初始赋值、复杂查询的时候,就显得特别方便。
1、获得系统当前时间
2、DateName ( datepart , date )返回表示指定日期的指定日期部分的字符串。
SELECT DATENAME(year, getdate()) AS 'Year Name' --------返回:2009
SELECT DATENAME(month, getdate()) AS 'Month Name' --------返回:02
SELECT DATENAME(weekday, getdate()) AS 'Weekday Name'------返回:星期二
3、DATEADD (datepart , number, date ),在向指定日期加上一段时间的基础上,返回新的 datetime 值。
select DateAdd(dd,2,'2008-8-8') --------------返回:2008-08-10 00:00:00.000
select dateadd(hh,-1,getdate()) --------------返回:2009-02-23 12:46:46.450,返回前一个小时的时间
4、DATEDIFF ( date-part, date-expression-1, date-expression-2 ) 返回两个日期之间的间隔。
此函数计算两个指定日期之间日期部分的数目。结果为日期部分中等于(date2 - date1)的有符号的整数值。
SELECT datediff( month, '1987/05/02', '1995/11/15' )------------------返回: 102
SELECT datediff( day, '00:00', '23:59' )------------------------------返回:0
SELECT datediff( day, '1999/07/19 00:00', '1999/07/23 23:59' )------返回:4
SELECT datediff( month, '1999/07/19', '1999/07/23' )------------------返回:0
SELECT datediff( month, '1999/07/19', '1999/08/23' )------------------返回:1
实例:查询当天更新的数据
5、DATEPART ( datepart ,date )返回代表指定日期的指定日期部分的整数。
SELECT DATEPART(year,getdate()) as 'Year' --------返回:2009
SELECT DATEPART(month,getdate()) as 'Month' ---------返回:2
SELECT DATEPART(weekday,getdate()) as 'Weekday' ---------返回:3,如:Sunday = 1、Saturday = 7
SELECT DAY(getdate()) -----------------------返回:24
Sql Server 中使用case when then 判断某字段是否为null,和判断是否为字符或数字时的写法不一样,如果不注意,很容易搞错
错误方法:
CASE columnName WHEN null THEN 0 ELSE columnName END
SQL Server中,有三个比较类似的功能:他们分别是:SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY,它们都返回插入到 IDENTITY 列中的值。
IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。
@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。
1.waitfor
--例 等待1 小时2 分零3 秒后才执行SELECT 语句
waitfor delay '01:02:03'
select * from employee
--例 等到晚上11 点零8 分后才执行SELECT 语句
waitfor time '23:08:00'
select * from employee
一个获得汉字字符串的首字母的T-SQL函数, 可用于拼音索引,代码如下:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
--创建取拼音函数 添加到标量值函数中,以后可以直接调用此函数
在创建表时,经常将主健ID设为自动增量,如果插入了三条数据,那么ID分别是1,2,3,将这三条数据删除之后,再次插入三条数据,此时它们的ID分别是4,5,6;
往往我们在测试一段代码时,插入了10000条的记录,测试完后删除测试的记录,新的数据ID将从10001开始,如果我们想要将标识的基数恢复到从1开始,必须修改表,先取消字段的标识,然后再加上去,OK;表一但多了,改起来真是太痛苦了。
偶然的机会,在MSDN上看到一种非常简单的方法,只要一句SQL就可以重置标识的基数,而且标识种子可以自已定义:
以下是我平时在工作中收藏的一些觉得有用的SQL语句,共大家使用
1.一句SQL语句获得当月天数:
select Day(dateadd(day,-1,convert(datetime,convert(char(07),dateadd(m,1,getdate()),120)+ '-01 ')))
select 32-Day(getdate()+(32-Day(getdate())))
2.说明:选择从10到15的记录:
select top 5 * from (select top 15 * from tableName order by id asc) table_别名 order by id desc
3.返回库中用户表:
select * from sysobjects where xtype='U'
在sql server中可以直接通过SQL语句实现按汉字首字母排序,比如我们经常用到的"按姓名首字母排序"
--把tableName和colName换成自己的就ok了
--按拼音
ALTER TABLE tableName
ALTER COLUMN colName nvarchar(100) COLLATE Chinese_PRC_CI_AS
select *from tableName order by colName
用一条SQL得到Access数据库中的随机记录集!
针对“用一条SQL得到数据库中的随机记录集”问题在网上已经有很多答案了:
SQL Server 2005:
SELECT TOP n * FROM tanblename ORDER BY NEWID()
Access
SELECT TOP n * FROM tanblename ORDER BY rnd([一个自动编号字段])
首先介绍一下sql server中“登录”与“用户”的区别,“登录”用于用户身份验证,而数据库“用
户”帐户用于数据库访问和权限验证。登录通过安全识别符 (SID) 与用户关联。将数据库恢复到其他服务
器时,数据库中包含一组用户和权限,但可能没有相应的登录或者登录所关联的用户可能不是相同的用户。
这种情况被称为存在“孤立用户”。
Advertise
Category
Time Counter
离十一还有
Recent Article
- 1.工作笔记:AS3加载外部图片,有加载百分比
- 2.document.documentElement和document.body的区别
- 3.100种增加网站流量的方法
- 4.用div+css模拟表格对角线
- 5.如何做一个好的技术型领导
- 6.苍井空是谁?
- 7."心态"新解
- 8.程序员特有的9个坏习惯
- 9.AS3入门之简单Loading效果
- 10.系统问题:浏览器无法打开png图片
- 11.AS3中以post和get方式提交数据
- 12.defaultTextFormat和setTextFormat()区别
- 13.AS3中超方便地遍历xml
- 14.pv3d中物体常用的移动属性
- 15.开源Flash 3D引擎Papervision3d
- 16.as3 判断鼠标滚轮前滚或后滚
- 17.js:行向上替换滚动效果
- 18.为什么要清净?(禅与佛)
- 19.扩展window.setTimeout方法
- 20.收集2010的搞笑短句




