SQLServer任意列之间的聚合
SQLServer任意列之间的聚合 收藏
sql的max之类的聚合函数只能针对同一列的n行运算,如果对n列运算,一般都用case 语句来判断,如果列少还比较容易写,列多了就麻烦了。这里介绍一个通过xml合并列并转为行集后直接用聚合函数求值的方法,测试用例和代码如下
--------------------------------------------------------------------------------
/*
测试名称:利用 XML 求任意列之间的聚合
测试功能:对一张表的列数据做 min 、 max 、 sum 和 avg 运算
运行原理:字段合并为 xml 后做 xquery 查询转为行集后聚合
作者: jinjazz (近身剪)
*/
-- 建立测试环境
declare @t table (
id smallint ,
a smallint , b smallint ,
c smallint , d smallint ,
e smallint , f smallint )
insert into @t
select 1, 1, 2, 3, 4, 6, 7 union all
select 2, 34, 45, 56, 54, 9, 6
-- 测试语句
select a.*, c.*
from @t a outer apply(
select doc=(
select * from @t as doc where id= a. id for xml path ( '' ), type )
) b
outer apply(
select
min ( r) as minValue,
max ( r) as maxValue,
sum ( r) as sumValue,
avg ( r) as avgValue
from (
select cast ( cast ( d. n. query( 'text()' ) as varchar ( max )) as int ) as r
from doc. nodes( '/a,b,c,d,e,f' ) D( n)) tt
) c
/* 测试结果
id a b c d e f minValue maxValue sumValue avgValue
------ ------ ------ ------ ------ ------ ------ ----------- ----------- ----------- -----------
1 1 2 3 4 6 7 1  
相关文档:
sqlserver2005有关键字ntile(x)和over(partition by.. order by..)子句配合.
比如获取每个表的前10%个字段。
select id , name , colid , rn from (
select * , rn = ntile (10 )
over (partition by id order by colorder )
from syscolumns )t where rn = 1 ......
可以用扩展存储过程xp_dirtree获取文件列表,用openrowset倒入数据到二进制字段。
openrowset的用法可以参考msdn
http://technet.microsoft.com/zh-cn/library/ms190312.aspx
如果文件很多,建议还是用程序倒入了
if (object_id ('t_bulkResult' ) is not null )
drop table t_bulkResult ......
SQLServer2005分解并导入xml文件 收藏
测试环境SQL2005,windows2003
DECLARE @idoc int;
DECLARE @doc xml;
SELECT @doc=bulkcolumn from OPENROWSET(
BULK 'D: \test.xml',
SINGLE_BLOB) AS x
EXEC sp_xml_preparedocument @Idoc OUTPUT, @doc
......
Declare @Id int
Declare @Name varchar(20)
Declare Cur Cursor For Select Id,Name from T_User
Open Cur
Fetch next from Cur Into @Id,@Name
While @@fetch_status=0
Begin
Update T_User Set [Name]=@Name,Id=@Id
......
SQLServer中的循环批处理
GO命令后面加一个常量就可以了
下面方法可以用来快速生成一批数据
if (object_id ('t' ) is not null ) drop table t
go
create table t (id int identity (1 , 1 ), name varchar (40 ))
go
insert into t (name ) select newid ()
go 10
select * from t
/*
1 &nbs ......