Aracılığıyla paylaş


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:

Konu bağlantısı simgesi 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)

Kavramlar

Analitik işlevler (Transact-sql)