SQL2005 學習筆記 視窗函式 OVER

2022-09-25 05:24:11 字數 3168 閱讀 5810

1.簡介:

sql server 2005中的視窗函式幫助你迅速檢視不同級別的聚合,通過它可以非常方便地累計總數、移動平均值、以及執行其它計算。

視窗函式功能非常強大,使用起來也十分容易。可以使用這個技巧立即得到大量統計值。

視窗是使用者指定的一組行。 開窗函式計算從視窗派生的結果集中各行的值。

2.適用範圍:

排名開窗函式和聚合開窗函式.

也就是說視窗函式是結合排名開窗函式或者聚合開窗函式一起使用

over子句前面必須是排名函式或者是聚合函式

3.例題:

複製** **如下:

--建立訂單表

create table salesorder(

orderid int, --訂單id

orderqty decimal(18,2) --數量

) g程式設計客棧o

--插入資料

insert into salesorder

select 1,2.0

union all

select 1,1.0

union all

select 1,3.0

union all

select 2,6.0

union all

select 2,1.1

union all

select 3,8.0

union all

select 3,1.1

union all

select 3,7.0

go --查詢得如下結果

select * from salesorder

go orderid orderqty

----------- ------------

1 2.00

1 1.00

1 3.00

2 6.00

2 1.10

3 8.00

3 1.10

3 7.00

現要求顯示彙總總數,每當所佔比例,分組匯總數,每單在各組所佔比例,要求格式如下:

orderid orderqty 彙總 每單比例 分組彙總 每單在各組比例

1 2.00 29.20 0.0685 6.00 0.3333

1 1.00 29.20 0.0342 6.00 0.1667

1 3.00 29.20 0.1027 6.00 0.5000

2 6.00 29.20 0.2055 7.10 0.8451

2 1.10 29.20 0.0377 7.10 0.1549

3 8.00 29.20 0.2740 16.10 0.4969

3 1.10 29.20 0.0377 16.10 0.0683

3 7.00 29.20 0.2397 16.10 0.4348

複製** **如下:

--利用視窗函式和聚合開窗函式,可以很快實現上述要求

select orderid,orderqty,

sum(orderqty) www.cppcns.comover() as [彙總],

convert(decimal(18,4), orderqty/sum(orderqty) over() ) as [每單所佔比例],

sum(orderqty) over(partition by orderid) as [分組彙總],

convert(decimal(18,4),orderqty/sum(orderqty) over(partition by orderid)) as [每單在各組所佔比例]

from salesorder

order by orderid

視窗函式是sql2005新增加的,下面我們看看在sql2000裡面怎麼實現上述的結果:

sql2000的實現步驟較麻煩,先計算出總數,再分組計算彙總,最後連線得到結果

複製** **如下:

--sql2000

declare @sum decimal(18,2)

select @sum=sum(orderqty)

from salesorder

--按orderid,計算每組的總計,然後插入臨時表

select orderid,sum(orderqty) as su

into #t

from salesorder

group by orderid

--連線臨時表,得到結果

select s.orderid,s.orderqty,

@sum as [彙總],

convert(decimal(18,4),s.orderqty/@sum) as [每單所佔比例],

t.su as [分組彙總],

convert(decimal(18,4),s.orderqty/t.su) as [每單在各組所佔比例]

from salesorder s join #t t

on t.orderid=s.orderid

order by s.orderid

drop table #t

go

上面演示的都是視窗函式與聚合開窗函式的使用,它與排名開窗函式請看下面例題:

複製** **如下:

-www.cppcns.com-與排名開窗函式使用

select orderid,orderqty,

rank() over(partition by orderid order by orderqty ) as [分組排名],

rank() over(order by orderqty ) as [排名]

from salesorder

order by orderid asc

--查詢得如下結果

orderid orderqty 分組排名 排名

1 2.00 2 4

1 3.00 3 5

1 1.00 1 1

2 1.10 1 2

2 6.00 2 6

3 7.00 2 7

3 8.00 3 8

3 1.10 1 2

本文標題: sql2005 學習筆記 視窗函式(over)

本文位址: /shujuku/mssql/50058.html

SQL2005新增函式

sql2005新增函式 sql2005新增了幾個結果集行號 排名 分組等函式,給我們帶來了很大的方便。1.row number函式 返回結果集分割槽內行的序列號。sql表是基於集合的,沒有像dbf,access這樣的記錄行的概念。row number函式返回行號不是資料表的物理行號,而是結果集分割槽...

SQL2005學習筆記 APPLY 運算子

建乙個表 create table mydata ids intidentity primary key,data nvarchar 1000 go 插入測試資料 insert into mydata values insert into mydata values a,b,c insert int...

sql2005時間函式

sql server中的日期與時間函式 1.當前系統日期 時間 select getdate 2.dateadd 在向指定日期加上一段時間的基礎上,返回新的 datetime 值 例如 向日期加上2天 select dateadd day,2,2004 10 15 返回 2004 10 17 00 ...