解析SQLServer任意列之間的聚合
更新時(shí)間:2013年06月27日 12:41:03 作者:
這里介紹一個(gè)通過xml合并列并轉(zhuǎn)為行集后直接用聚合函數(shù)求值的方法,測(cè)試用例和代碼如下
sql的max之類的聚合函數(shù)只能針對(duì)同一列的n行運(yùn)算,如果對(duì)n列運(yùn)算,一般都用case 語(yǔ)句來判斷,如果列少還比較容易寫,列多了就麻煩了。
--------------------------------------------------------------------------------
/*
測(cè)試名稱:利用 XML 求任意列之間的聚合
測(cè)試功能:對(duì)一張表的列數(shù)據(jù)做 min 、 max 、 sum 和 avg 運(yùn)算
運(yùn)行原理:字段合并為 xml 后做 xquery 查詢轉(zhuǎn)為行集后聚合
*/
-- 建立測(cè)試環(huán)境
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
-- 測(cè)試語(yǔ)句
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
/* 測(cè)試結(jié)果
id a b c d e f minValue maxValue sumValue avgValue
------ ------ ------ ------ ------ ------ ------ ----------- ----------- ----------- -----------
1 1 2 3 4 6 7 1 7 23 3
2 34 45 56 54 9 6 6 56 204 34
*/
--------------------------------------------------------------------------------
/*
測(cè)試名稱:利用 XML 求任意列之間的聚合
測(cè)試功能:對(duì)一張表的列數(shù)據(jù)做 min 、 max 、 sum 和 avg 運(yùn)算
運(yùn)行原理:字段合并為 xml 后做 xquery 查詢轉(zhuǎn)為行集后聚合
*/
-- 建立測(cè)試環(huán)境
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
-- 測(cè)試語(yǔ)句
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
/* 測(cè)試結(jié)果
id a b c d e f minValue maxValue sumValue avgValue
------ ------ ------ ------ ------ ------ ------ ----------- ----------- ----------- -----------
1 1 2 3 4 6 7 1 7 23 3
2 34 45 56 54 9 6 6 56 204 34
*/
您可能感興趣的文章:
相關(guān)文章
分享SQL Server刪除重復(fù)行的6個(gè)方法
SQL Server刪除重復(fù)行是我們最常見的操作之一,下面就為您介紹六種適合不同情況的SQL Server刪除重復(fù)行的方法,供您參考。2011-09-09
SqlServer 在事務(wù)中獲得自增ID的實(shí)例代碼
這篇文章主要介紹了 SqlServer 在事務(wù)中獲得自增ID實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03
SQLSERVER對(duì)索引的利用及非SARG運(yùn)算符認(rèn)識(shí)
SQL對(duì)篩選條件簡(jiǎn)稱:SARG(search argument/SARG)當(dāng)然這里不是說SQLSERVER的where子句,是說SQLSERVER對(duì)索引的利用,感興趣的朋友可以了解下,或許本文的知識(shí)點(diǎn)對(duì)你有所幫助哈2013-02-02
SQLserver2000 企業(yè)版 出現(xiàn)"進(jìn)程51發(fā)生了嚴(yán)重的異常"錯(cuò)誤的處理方法
SQL2000 企業(yè)版 出現(xiàn)“進(jìn)程51發(fā)生了嚴(yán)重的異常”錯(cuò)誤的解決方法,利用了微軟官方的工具。2009-07-07
做購(gòu)物車系統(tǒng)時(shí)利用到得幾個(gè)sqlserver 存儲(chǔ)過程
最近使用asp.net+sql2000開始開發(fā)一個(gè)小型商城系統(tǒng),其中涉及到得購(gòu)物車功能主要是仿照淘寶實(shí)現(xiàn)的.2009-12-12
必須會(huì)的SQL語(yǔ)句(八) 數(shù)據(jù)庫(kù)的完整性約束
這篇文章主要介紹了sqlserver中數(shù)據(jù)庫(kù)的完整性約束使用方法,需要的朋友可以參考下2015-01-01

