Yan (Transact-sql)
Bölümleme ve ilişkili pencere işlevi uygulanmadan önce bir sipariş belirler. Yani ÜZERINDEN yan tümcesi bir pencere veya kullanıcı tarafından belirtilen sorgu sonuç kümesindeki satır kümesi tanımlar. Bir pencere işlev ardından penceredeki her satır için bir değer hesaplar. Toplamları çalıştıran hareketli ortalamalar, kümülatif toplamları gibi toplanan değerleri hesaplamak için işlevleri ile ÜZERINDEN yan tümcesi kullanabilirsiniz veya bir üst n grubu başına sonuç.
İçin geçerlidir:
Transact-SQL Sözdizim Kuralları
Sözdizimi
OVER (
[ <PARTITION BY clause> ]
[ <ORDER BY clause> ]
[ <ROW or RANGE clause> ]
)
<PARTITION BY clause> ::=
PARTITION BY value_expression , ... [ n ]
<ORDER BY clause> ::=
ORDER BY order_by_expression
[ COLLATE collation_name ]
[ ASC | DESC ]
[ ,...n ]
<ROW or RANGE clause> ::=
{ ROWS | RANGE } <window frame extent>
<window frame extent> ::=
{ <window frame preceding>
| <window frame between>
}
<window frame between> ::=
BETWEEN <window frame bound> AND <window frame bound>
<window frame bound> ::=
{ <window frame preceding>
| <window frame following>
}
<window frame preceding> ::=
{
UNBOUNDED PRECEDING
| <unsigned_value_specification> PRECEDING
| CURRENT ROW
}
<window frame following> ::=
{
UNBOUNDED FOLLOWING
| <unsigned_value_specification> FOLLOWING
| CURRENT ROW
}
<unsigned value specification> ::=
{ <unsigned integer literal> }
Bağımsız değişkenler
BÖLÜM TARAFINDAN
Sorgunun sonuç kümesi bölümlere ayırır. Penceresi işlevi her bölüm için ayrı ayrı uygulanır ve her bölüm için yeniden hesaplama.value_expression
Satır kümesi olarak bölümlenmiş sütun belirtir. value_expressionyalnızca sütunları from yan tümcesi tarafından kullanılabilir duruma gelebilir. value_expressionifadeler veya diğer adlar seçin listesinde başvuruda bulunamaz. value_expressionbir sütun ifadesi, skalar alt sorgu, skalar fonksiyon veya kullanıcı tanımlı değişken olabilir.<ORDER BY yan tümcesi>
Satır sonuç kümesi her bölüm içinde mantıksal sırasını tanımlar. Başka bir deyişle, pencere functioncalculation gerçekleştirileceği mantıksal sırasını belirtir.order_by_expression
Bir sütunu veya ifade sıralamada temel alınacak belirtir. order_by_expressionyalnızca sütunları from yan tümcesi tarafından kullanılabilir duruma gelebilir. Bir sütun adı veya takma adı temsil eden bir tamsayı belirtilemez.HARMANLAcollation_name
order by işlem belirtilen harmanlama göre gerçekleştirilmesi gerektiğini belirtir collation_name. collation_namebir Windows harmanlaması adı veya sql harmanlaması adı olabilir. Daha fazla bilgi için, bkz. Harmanlama ve Unicode desteği. HARMANLAMA türü sütunlar için uygun char, varchar, nchar, ve nvarchar.ASC | DESC]
Belirtilen sütun değerleri artan veya azalan düzende sıralanması gerektiğini belirtir. asc varsayılan sıralama düzeni olduğunu. Boş değerler en düşük olası değerleri olarak kabul edilir.SATIR | ARALIĞI
Daha fazla bölüm içindeki satır başlangıç ve bitiş noktaları bölüm içerisinde belirterek sınırlar. Bu mantıksal ilişki ya da fiziksel ilişki geçerli satır için bir satır aralığı belirterek yapılır. Fiziksel ilişki SATIRLARI yan tümcesi kullanılarak elde edilir.Yan tümcesi satır satır yukarıdaki veya aşağıdaki geçerli satırın sabit bir sayı belirterek satır içinde bir bölüm sınırlar. Alternatif olarak, çeşitli yan mantıksal olarak, geçerli satırda değeri için bir değer aralığı belirterek satır içinde bir bölüm sınırlar. Önceki ve aşağıdaki satırları order by yan tümcesinde sipariş alınarak tanımlanmıştır. Pencere çerçevesi "aralığı... Geçerli SATIRIN... "order by ifade geçerli satır olarak aynı değerlere sahip tüm satırları içerir. Örneğin, satırlar arasında 2 önceki ve geçerli satır, 2 satır, geçerli satır (dahil) kadar önceki başlayarak işlevi çalışır Satırları penceresi boyutu, üç satır olduğunu gösterir.
[!NOT]
SATIR veya aralığı order by yan tümcesi belirtilmesini gerektirir. order by birden çok sipariş ifadeler içeriyorsa, geçerli satır için aralığı tüm sütunlar order by listesinde geçerli satırın belirlerken dikkate alır.
SINIRSIZ ÖNCEKİ
Pencere bölümünün ilk satırına başlayacağını belirtir. SINIRSIZ önceki sadece başlangıç noktası pencere olarak belirtilebilir.<işaretsiz değer belirtiminin> PRECEDING
İle belirtilen <imzasız değer belirtiminin>satır veya geçerli satırın gelmesini değerleri sayısını belirtmek için. Bu belirtim aralığı için izin verilmez.GEÇERLİ SATIR
Pencere başlatır veya geçerli satır satır veya aralığı ile kullanıldığında geçerli değeri kullanıldığında biten belirtir. Geçerli satır, hem bir başlangıç ve bitiş noktası belirtilebilir.ARASINDAKİ <bağlı çerçeve kenarlarını > ve <bağlı pencere çerçevesi>
SATIR veya aralığı (başlangıç) alt ve üst (bitiş) sınır noktaları penceresi belirtmek için kullanılır. <pencere çerçevesi bağlı> başlangıç noktası sınırı tanımlar ve <bağlı çerçeve kenarlarını> sınır bitiş noktasını tanımlar. Üst sınır alt sınırı küçük olamaz.SINIRSIZ AŞAĞIDAKİ
Pencere, bölümün son satırı sona ereceğini belirtir. SINIRSIZ aşağıdaki yalnızca bir pencere bitiş noktası belirtilebilir. Örneğin geçerli satır ile başlayan ve bölümün son satırı ile biten bir pencere aralığı arasındaki geçerli satır ve sınırsız aşağıdaki tanımlar.<işaretsiz değer belirtiminin> aşağıdaki
İle belirtilen <imzasız değer belirtiminin> satır veya değerleri geçerli satırın takip numarasını belirtmek için. Ne zaman <imzasız değer belirtiminin> aşağıda belirtilen pencere olarak başlangıç noktası, bitiş noktası olmalıdır <imzasız değer belirtiminin>aşağıdaki. Örneğin, geçerli satırı izleyen ve geçerli satırı izleyen onuncu satır ile biten ikinci satır ile başlayan bir pencere satırlar arasında 2 aşağıdaki ve 10 aşağıdaki tanımlar. Bu belirtim aralığı için izin verilmez.işaretsiz tamsayı hazır
Satır veya önce veya yeni bir satır veya değer için değerleri belirtir bir pozitif tamsayı değişmez (0 dahil) dir. Bu, yalnızca satırlar için geçerli bir belirtimdir.
Genel Yorumlar
Tek tek bir sorguda birden çok pencere işlev kullanılabilir from yan tümcesi. Her işlevin ÜZERINDEN yan tümcesi, bölümleme ve sıralama farklı olabilir.
PARTITION BY belirtilmezse, işlev, sorgu sonuç kümesinin tüm satırlarını tek bir grup olarak ele alır.
order by tüm belirtilmezse, bölüm için bir pencere çerçevesi kullanılır. Bu, order by yan tümcesi gerektirmeyen işlevler için geçerlidir. SATIR/aralığı belirtilmemiş, ancak sipariş tarafından belirtilen Aralık sınırsız önceki ve geçerli satır pencere çerçevelemek için varsayılan olarak kullanılır. Bu sadece geçerli olan işlevler isteğe bağlı satır/ARALIĞININ tanımlamasını kabul edebilir. Örneğin, sıralama işlevleri satır/aralığı kabul edemez, bu nedenle bu pencere çerçevesi order by varsa ve satır/Aralık değil olsa bile uygulanmaz.
SATIR/aralığı belirtildiğinde ve <pencere çerçevesi önceki> kullanılan <pencere çerçeve ölçüde> (kısa sözdizimi) sonra bu belirtim pencere çerçeve sınırı başlangıç noktası için kullanılır ve geçerli satır için sınır bitiş noktası kullanılır. Örneğin "5 satır önceki" "SATIRLARI arasında 5 önceki ve geçerli satır için" eşittir.
Sınırlamalar ve Kısıtlamalar
ÜZERINDEN yan tümcesi ile sağlama toplama işlevi kullanılamaz.
ARALIĞI ile kullanılamaz <imzasız değer belirtiminin> PRECEDING veya <imzasız değer belirtiminin> aşağıdaki.
ÜZERINDEN yan tümcesi ile kullanılan sıralama, toplama veya analitik fonksiyon bağlı <order by yan tümcesi> ve/veya <satır ve çeşitli yan> desteklenmiyor olabilir.
Örnekler
A.ÜZERINDEN yan tümcesi ile row_number işlevini kullanma
Bir bölüm içindeki her satır için bir satır numarasını görüntülemek için ÜZERINDEN yan tümcesi ile row_number işlevini kullanarak aşağıdaki örnek gösterilmektedir. ALTI yan tümcesinde belirtilen order by yan tümcesi satırları her bölümünde sütun tarafından emir SalesYTD. select deyimi içinde order by yan tümcesi içinde tüm sorgu sonuç kümesi sipariş verilir belirler.
USE AdventureWorks2012;
GO
SELECT ROW_NUMBER() OVER(PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS 'Row Number',
p.LastName, s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0
ORDER BY PostalCode;
GO
USE AdventureWorks2012;
GO
SELECT ROW_NUMBER() OVER(PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS 'Row Number',
p.LastName, s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0
ORDER BY PostalCode;
GO
Sonuç kümesi buradadır.
Row Number LastName SalesYTD PostalCode
--------------- ----------------------- --------------------- ----------
1 Mitchell 4251368.5497 98027
2 Blythe 3763178.1787 98027
3 Carson 3189418.3662 98027
4 Reiter 2315185.611 98027
5 Vargas 1453719.4653 98027
6 Ansman-Wolfe 1352577.1325 98027
1 Pak 4116871.2277 98055
2 Varkey Chudukatil 3121616.3202 98055
3 Saraiva 2604540.7172 98055
4 Ito 2458535.6169 98055
5 Valdez 1827066.7118 98055
6 Mensa-Annan 1576562.1966 98055
7 Campbell 1573012.9383 98055
8 Tsoflias 1421810.9242 98055
B.ÜZERINDEN yan tümcesi ile toplama işlevlerini kullanma
Aşağıdaki örnek OVERyan tümcesi ile toplama işlevleri üzerinden tüm satırlar, sorgu tarafından döndürülen. Bu örnekte kullanarak OVERyan tümcesi daha toplama değerlerini türetmek için alt sorgular kullanarak daha verimli.
USE AdventureWorks2012;
GO
SELECT SalesOrderID, ProductID, OrderQty
,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total'
,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Avg'
,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Count'
,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Min'
,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Max'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN(43659,43664);
GO
USE AdventureWorks2012;
GO
SELECT SalesOrderID, ProductID, OrderQty
,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total'
,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Avg'
,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Count'
,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Min'
,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Max'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN(43659,43664);
GO
Sonuç kümesi buradadır.
SalesOrderID ProductID OrderQty Total Avg Count Min Max
------------ ----------- -------- ----------- ----------- ----------- ------ ------
43659 776 1 26 2 12 1 6
43659 777 3 26 2 12 1 6
43659 778 1 26 2 12 1 6
43659 771 1 26 2 12 1 6
43659 772 1 26 2 12 1 6
43659 773 2 26 2 12 1 6
43659 774 1 26 2 12 1 6
43659 714 3 26 2 12 1 6
43659 716 1 26 2 12 1 6
43659 709 6 26 2 12 1 6
43659 712 2 26 2 12 1 6
43659 711 4 26 2 12 1 6
43664 772 1 14 1 8 1 4
43664 775 4 14 1 8 1 4
43664 714 1 14 1 8 1 4
43664 716 1 14 1 8 1 4
43664 777 2 14 1 8 1 4
43664 771 3 14 1 8 1 4
43664 773 1 14 1 8 1 4
43664 778 1 14 1 8 1 4
SalesOrderID ProductID OrderQty Total Avg Count Min Max
------------ ----------- -------- ----------- ----------- ----------- ------ ------
43659 776 1 26 2 12 1 6
43659 777 3 26 2 12 1 6
43659 778 1 26 2 12 1 6
43659 771 1 26 2 12 1 6
43659 772 1 26 2 12 1 6
43659 773 2 26 2 12 1 6
43659 774 1 26 2 12 1 6
43659 714 3 26 2 12 1 6
43659 716 1 26 2 12 1 6
43659 709 6 26 2 12 1 6
43659 712 2 26 2 12 1 6
43659 711 4 26 2 12 1 6
43664 772 1 14 1 8 1 4
43664 775 4 14 1 8 1 4
43664 714 1 14 1 8 1 4
43664 716 1 14 1 8 1 4
43664 777 2 14 1 8 1 4
43664 771 3 14 1 8 1 4
43664 773 1 14 1 8 1 4
43664 778 1 14 1 8 1 4
Aşağıdaki örnek kullanarak OVERyan tümcesi ile bir toplama işlevi hesaplanmış değer.
USE AdventureWorks2012;
GO
SELECT SalesOrderID, ProductID, OrderQty
,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total'
,CAST(1. * OrderQty / SUM(OrderQty) OVER(PARTITION BY SalesOrderID)
*100 AS DECIMAL(5,2))AS 'Percent by ProductID'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN(43659,43664);
GO
USE AdventureWorks2012;
GO
SELECT SalesOrderID, ProductID, OrderQty
,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total'
,CAST(1. * OrderQty / SUM(OrderQty) OVER(PARTITION BY SalesOrderID)
*100 AS DECIMAL(5,2))AS 'Percent by ProductID'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN(43659,43664);
GO
Sonuç kümesi buradadır.Toplamları tarafından hesaplanır dikkat edin SalesOrderIDve Percent by ProductIDher her satır için hesaplanan SalesOrderID.
SalesOrderID ProductID OrderQty Total Percent by ProductID
------------ ----------- -------- ----------- ---------------------------------------
43659 776 1 26 3.85
43659 777 3 26 11.54
43659 778 1 26 3.85
43659 771 1 26 3.85
43659 772 1 26 3.85
43659 773 2 26 7.69
43659 774 1 26 3.85
43659 714 3 26 11.54
43659 716 1 26 3.85
43659 709 6 26 23.08
43659 712 2 26 7.69
43659 711 4 26 15.38
43664 772 1 14 7.14
43664 775 4 14 28.57
43664 714 1 14 7.14
43664 716 1 14 7.14
43664 777 2 14 14.29
43664 771 3 14 21.43
43664 773 1 14 7.14
43664 778 1 14 7.14
(20 row(s) affected)
SalesOrderID ProductID OrderQty Total Percent by ProductID
------------ ----------- -------- ----------- ---------------------------------------
43659 776 1 26 3.85
43659 777 3 26 11.54
43659 778 1 26 3.85
43659 771 1 26 3.85
43659 772 1 26 3.85
43659 773 2 26 7.69
43659 774 1 26 3.85
43659 714 3 26 11.54
43659 716 1 26 3.85
43659 709 6 26 23.08
43659 712 2 26 7.69
43659 711 4 26 15.38
43664 772 1 14 7.14
43664 775 4 14 28.57
43664 714 1 14 7.14
43664 716 1 14 7.14
43664 777 2 14 14.29
43664 771 3 14 21.43
43664 773 1 14 7.14
43664 778 1 14 7.14
(20 row(s) affected)
C.Hareketli ortalama ve kümülatif toplam üretim
Aşağıdaki örnek avg ve TOPLA işlevleri, yıllık satışları hareketli ortalama ve kümülatif toplamını her ülkesinde sağlamak için ÜZERINDEN yan tümcesi ile kullanır Sales.SalesPersontablosu. Verileri tarafından bölümlendirilir TerritoryIDve mantıklı tarafından sipariş SalesYTD. Yani avg işlevini satış yılı her bölge için hesaplanır. Bunun için fark TerritoryID1, orada olan satış 2005 yılı için iki satır gösteren iki satış kişi satış yıl. Bu iki satır ortalama satış hesaplanan ve sonra 2006 yılı için satış gösteren üçüncü satırın hesaplama dahil edilir.
USE AdventureWorks2012;
GO
SELECT BusinessEntityID, TerritoryID
,DATEPART(yy,ModifiedDate) AS SalesYear
,CONVERT(varchar(20),SalesYTD,1) AS SalesYTD
,CONVERT(varchar(20),AVG(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY DATEPART(yy,ModifiedDate)
),1) AS MovingAvg
,CONVERT(varchar(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY DATEPART(yy,ModifiedDate)
),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5
ORDER BY TerritoryID,SalesYear;
USE AdventureWorks2012;
GO
SELECT BusinessEntityID, TerritoryID
,DATEPART(yy,ModifiedDate) AS SalesYear
,CONVERT(varchar(20),SalesYTD,1) AS SalesYTD
,CONVERT(varchar(20),AVG(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY DATEPART(yy,ModifiedDate)
),1) AS MovingAvg
,CONVERT(varchar(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY DATEPART(yy,ModifiedDate)
),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5
ORDER BY TerritoryID,SalesYear;
Sonuç kümesi buradadır.
BusinessEntityID TerritoryID SalesYear SalesYTD MovingAvg CumulativeTotal
---------------- ----------- ----------- -------------------- -------------------- --------------------
274 NULL 2005 559,697.56 559,697.56 559,697.56
287 NULL 2006 519,905.93 539,801.75 1,079,603.50
285 NULL 2007 172,524.45 417,375.98 1,252,127.95
283 1 2005 1,573,012.94 1,462,795.04 2,925,590.07
280 1 2005 1,352,577.13 1,462,795.04 2,925,590.07
284 1 2006 1,576,562.20 1,500,717.42 4,502,152.27
275 2 2005 3,763,178.18 3,763,178.18 3,763,178.18
277 3 2005 3,189,418.37 3,189,418.37 3,189,418.37
276 4 2005 4,251,368.55 3,354,952.08 6,709,904.17
281 4 2005 2,458,535.62 3,354,952.08 6,709,904.17
(10 row(s) affected)
BusinessEntityID TerritoryID SalesYear SalesYTD MovingAvg CumulativeTotal
---------------- ----------- ----------- -------------------- -------------------- --------------------
274 NULL 2005 559,697.56 559,697.56 559,697.56
287 NULL 2006 519,905.93 539,801.75 1,079,603.50
285 NULL 2007 172,524.45 417,375.98 1,252,127.95
283 1 2005 1,573,012.94 1,462,795.04 2,925,590.07
280 1 2005 1,352,577.13 1,462,795.04 2,925,590.07
284 1 2006 1,576,562.20 1,500,717.42 4,502,152.27
275 2 2005 3,763,178.18 3,763,178.18 3,763,178.18
277 3 2005 3,189,418.37 3,189,418.37 3,189,418.37
276 4 2005 4,251,368.55 3,354,952.08 6,709,904.17
281 4 2005 2,458,535.62 3,354,952.08 6,709,904.17
(10 row(s) affected)
Bu örnekte, bölüm tarafından ÜZERINDEN yan tümcesi içermez. Bu işlev tüm satırlar, sorgu tarafından döndürülen uygulanacağı anlamına gelir. ALTI yan tümcesinde belirtilen order by yan tümcesi avg işlevini uygulandığı mantıksal sırası belirler. Hareketli ortalama satış yıl tüm satış bölgeleri için where yan tümcesinde belirtilen sorgu döndürür. select deyiminde belirtilen order by yan tümcesi içinde satırları sorgu görüntülenme sırasını belirler.
SELECT BusinessEntityID, TerritoryID
,DATEPART(yy,ModifiedDate) AS SalesYear
,CONVERT(varchar(20),SalesYTD,1) AS SalesYTD
,CONVERT(varchar(20),AVG(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)
),1) AS MovingAvg
,CONVERT(varchar(20),SUM(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)
),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5
ORDER BY SalesYear;
SELECT BusinessEntityID, TerritoryID
,DATEPART(yy,ModifiedDate) AS SalesYear
,CONVERT(varchar(20),SalesYTD,1) AS SalesYTD
,CONVERT(varchar(20),AVG(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)
),1) AS MovingAvg
,CONVERT(varchar(20),SUM(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)
),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5
ORDER BY SalesYear;
Sonuç kümesi buradadır.
BusinessEntityID TerritoryID SalesYear SalesYTD MovingAvg CumulativeTotal
---------------- ----------- ----------- -------------------- -------------------- --------------------
274 NULL 2005 559,697.56 2,449,684.05 17,147,788.35
275 2 2005 3,763,178.18 2,449,684.05 17,147,788.35
276 4 2005 4,251,368.55 2,449,684.05 17,147,788.35
277 3 2005 3,189,418.37 2,449,684.05 17,147,788.35
280 1 2005 1,352,577.13 2,449,684.05 17,147,788.35
281 4 2005 2,458,535.62 2,449,684.05 17,147,788.35
283 1 2005 1,573,012.94 2,449,684.05 17,147,788.35
284 1 2006 1,576,562.20 2,138,250.72 19,244,256.47
287 NULL 2006 519,905.93 2,138,250.72 19,244,256.47
285 NULL 2007 172,524.45 1,941,678.09 19,416,780.93
(10 row(s) affected)
BusinessEntityID TerritoryID SalesYear SalesYTD MovingAvg CumulativeTotal
---------------- ----------- ----------- -------------------- -------------------- --------------------
274 NULL 2005 559,697.56 2,449,684.05 17,147,788.35
275 2 2005 3,763,178.18 2,449,684.05 17,147,788.35
276 4 2005 4,251,368.55 2,449,684.05 17,147,788.35
277 3 2005 3,189,418.37 2,449,684.05 17,147,788.35
280 1 2005 1,352,577.13 2,449,684.05 17,147,788.35
281 4 2005 2,458,535.62 2,449,684.05 17,147,788.35
283 1 2005 1,573,012.94 2,449,684.05 17,147,788.35
284 1 2006 1,576,562.20 2,138,250.72 19,244,256.47
287 NULL 2006 519,905.93 2,138,250.72 19,244,256.47
285 NULL 2007 172,524.45 1,941,678.09 19,416,780.93
(10 row(s) affected)
D.SATIRLARI yan belirtme
Aşağıdaki örnek, bir pencere üzerinden hesaplanan satır geçerli satır tanımlamak için SATIRLARI yan tümcesi kullanır ve n (Bu örnekte 1 satır) izleyen bir satır numarası.
SELECT BusinessEntityID, TerritoryID
,CONVERT(varchar(20),SalesYTD,1) AS SalesYTD
,DATEPART(yy,ModifiedDate) AS SalesYear
,CONVERT(varchar(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY DATEPART(yy,ModifiedDate)
ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING ),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5;
SELECT BusinessEntityID, TerritoryID
,CONVERT(varchar(20),SalesYTD,1) AS SalesYTD
,DATEPART(yy,ModifiedDate) AS SalesYear
,CONVERT(varchar(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY DATEPART(yy,ModifiedDate)
ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING ),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5;
Sonuç kümesi buradadır.
BusinessEntityID TerritoryID SalesYTD SalesYear CumulativeTotal
---------------- ----------- -------------------- ----------- --------------------
274 NULL 559,697.56 2005 1,079,603.50
287 NULL 519,905.93 2006 692,430.38
285 NULL 172,524.45 2007 172,524.45
283 1 1,573,012.94 2005 2,925,590.07
280 1 1,352,577.13 2005 2,929,139.33
284 1 1,576,562.20 2006 1,576,562.20
275 2 3,763,178.18 2005 3,763,178.18
277 3 3,189,418.37 2005 3,189,418.37
276 4 4,251,368.55 2005 6,709,904.17
281 4 2,458,535.62 2005 2,458,535.62
BusinessEntityID TerritoryID SalesYTD SalesYear CumulativeTotal
---------------- ----------- -------------------- ----------- --------------------
274 NULL 559,697.56 2005 1,079,603.50
287 NULL 519,905.93 2006 692,430.38
285 NULL 172,524.45 2007 172,524.45
283 1 1,573,012.94 2005 2,925,590.07
280 1 1,352,577.13 2005 2,929,139.33
284 1 1,576,562.20 2006 1,576,562.20
275 2 3,763,178.18 2005 3,763,178.18
277 3 3,189,418.37 2005 3,189,418.37
276 4 4,251,368.55 2005 6,709,904.17
281 4 2,458,535.62 2005 2,458,535.62
Aşağıdaki örnekte satır yan sınırsız önceki ile belirtilir. Pencere bölümünün ilk satırına başlar sonucudur.
SELECT BusinessEntityID, TerritoryID
,CONVERT(varchar(20),SalesYTD,1) AS SalesYTD
,DATEPART(yy,ModifiedDate) AS SalesYear
,CONVERT(varchar(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY DATEPART(yy,ModifiedDate)
ROWS UNBOUNDED PRECEDING),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5;
SELECT BusinessEntityID, TerritoryID
,CONVERT(varchar(20),SalesYTD,1) AS SalesYTD
,DATEPART(yy,ModifiedDate) AS SalesYear
,CONVERT(varchar(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY DATEPART(yy,ModifiedDate)
ROWS UNBOUNDED PRECEDING),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5;
Sonuç kümesi buradadır.
BusinessEntityID TerritoryID SalesYTD SalesYear CumulativeTotal
---------------- ----------- -------------------- ----------- --------------------
274 NULL 559,697.56 2005 559,697.56
287 NULL 519,905.93 2006 1,079,603.50
285 NULL 172,524.45 2007 1,252,127.95
283 1 1,573,012.94 2005 1,573,012.94
280 1 1,352,577.13 2005 2,925,590.07
284 1 1,576,562.20 2006 4,502,152.27
275 2 3,763,178.18 2005 3,763,178.18
277 3 3,189,418.37 2005 3,189,418.37
276 4 4,251,368.55 2005 4,251,368.55
281 4 2,458,535.62 2005 6,709,904.17
BusinessEntityID TerritoryID SalesYTD SalesYear CumulativeTotal
---------------- ----------- -------------------- ----------- --------------------
274 NULL 559,697.56 2005 559,697.56
287 NULL 519,905.93 2006 1,079,603.50
285 NULL 172,524.45 2007 1,252,127.95
283 1 1,573,012.94 2005 1,573,012.94
280 1 1,352,577.13 2005 2,925,590.07
284 1 1,576,562.20 2006 4,502,152.27
275 2 3,763,178.18 2005 3,763,178.18
277 3 3,189,418.37 2005 3,189,418.37
276 4 4,251,368.55 2005 4,251,368.55
281 4 2,458,535.62 2005 6,709,904.17
Ayrıca bkz.
Başvuru
Toplama işlevleri (Transact-sql)