Aracılığıyla paylaş


GROUPING_ID (Transact-SQL)

gruplandırma düzey hesaplar işlev kullanılır.GROUPING_ID yalnızca select kullanılabilir <seçin> sahip, liste veya group by belirtildiğinde yan tümceleri ile sipariş.

Konu bağlantısı simgesiTransact-SQL sözdizimi kuralları

Sözdizimi

GROUPING_ID ( <column_expression>[ ,...n ] )

Bağımsız değişkenler

  • <column_expression>
    Olan bir column_expression , bir group by yan tümce.

Dönüş Türü

int

Açıklamalar

GROUPING_ID <column_expression> grupla listesinde ifade tam olarak eşleşmelidir.gruplandırma datepart tarafından olan, örneğin, (yyyy, <column name>), GROUPING_ID kullanın (datepart (yyyy, <column name>)); veya gruplandırma tarafından ise <column name>, GROUPING_ID kullanın (<column name>).

Karşılaştırma GRUPLANDIRMA () GROUPING_ID)

GROUPING_ID (<column_expression> [ ,...n ]) GRUPLANDIRMA eşdeğeri girdi (<column_expression>) döndürülen satırların her birindeki çıktı bir dize olarak yorumlar ve sıfır sütun listesindeki her sütun için.GROUPING_ID, bu dize 2 tabanındaki numarası olarak yorumlar ve eşdeğer tamsayıyı döndürür.Örneğin, aşağıdaki deyimgöz önünde bulundurun: SELECT a, b, c, SUM(d),GROUPING_ID(a,b,c)FROM T GROUP BY <group by list>.Aşağıdaki tablo , giriş ve çıkış değerleri (GROUPING_ID) gösterir.

Toplanan sütunlar

Giriş GROUPING_ID (a, b, c) = GROUPING(a) + GROUPING(b) + GROUPING(c)

GROUPING_ID () çıkış

a

100

4

b

010

2

c

001

1

ab

110

6

ac

101

5

bc

011

3

abc

111

7

Teknik tanımı (GROUPING_ID)

Her GROUPING_ID bağımsız değişkeni, group by listesi öğesi olmalıdır.GROUPING_ID () işlevi bir integer bitmap, en düşük n bit lit. olabilirBir çok bit ilgili bağımsız değişkeni olmayan bir gruplandırmasütun için olduğunu gösterir verilen çıkış satır.En düşük sıralı bit karşılık gelen bağımsız n ve n-1th en düşük sipariş bit 1 bağımsız değişkenine karşılık gelir.

GROUPING_ID () eşdeğerleri

Bir tek gruplandırma sorgu için GRUPLANDIRMA (<column_expression>) GROUPING_ID için eşdeğeri olan (<column_expression>), ve her ikisi de 0 döndürür.

Örneğin, aşağıdaki ifadeler birbirleriyle eşdeğerdir:

SELECT GROUPING_ID(A,B)
FROM T 
GROUP BY CUBE(A,B) 
SELECT 3 FROM T GROUP BY ()
UNION ALL
SELECT 1 FROM T GROUP BY A
UNION ALL
SELECT 2 FROM T GROUP BY B
UNION ALL
SELECT 0 FROM T GROUP BY A,B

Örnekler

A.gruplandırma düzeyleri tanımlamak için GROUPING_ID kullanma

Aşağıdaki örnek çalışanların sayısını döndürür Name ve Title, Name, ve şirketin toplam.GROUPING_ID()her satır için bir değer oluşturmak için kullanılan Titlesütun kendi toplama düzey tanımlar.

USE AdventureWorks2008R2;
GO
SELECT D.Name
    ,CASE 
    WHEN GROUPING_ID(D.Name, E.JobTitle) = 0 THEN E.JobTitle
    WHEN GROUPING_ID(D.Name, E.JobTitle) = 1 THEN N'Total: ' + D.Name 
    WHEN GROUPING_ID(D.Name, E.JobTitle) = 3 THEN N'Company Total:'
        ELSE N'Unknown'
    END AS N'Job Title'
    ,COUNT(E.BusinessEntityID) AS N'Employee Count'
FROM HumanResources.Employee E
    INNER JOIN HumanResources.EmployeeDepartmentHistory DH
        ON E.BusinessEntityID = DH.BusinessEntityID
    INNER JOIN HumanResources.Department D
        ON D.DepartmentID = DH.DepartmentID     
WHERE DH.EndDate IS NULL
    AND D.DepartmentID IN (12,14)
GROUP BY ROLLUP(D.Name, E.JobTitle);

B.Filtre bir sonuç kümesiiçin GROUPING_ID kullanma

Basit örnek

Aşağıdaki kodda, başlığa göre çalışanların sayısı olan satırları döndürmek için yorum karakterleri kaldırmak HAVING GROUPING_ID(D.Name, E.JobTitle); = 0.Bölüm tarafından yalnızca çalışanların sayısı olan satırları döndürmek için yorum karakterleri kaldırmak HAVING GROUPING_ID(D.Name, E.JobTitle) = 1;.

USE AdventureWorks2008R2;
GO
SELECT D.Name
    ,E.JobTitle
    ,GROUPING_ID(D.Name, E.JobTitle) AS 'Grouping Level'
    ,COUNT(E.BusinessEntityID) AS N'Employee Count'
FROM HumanResources.Employee AS E
    INNER JOIN HumanResources.EmployeeDepartmentHistory AS DH
        ON E.BusinessEntityID = DH.BusinessEntityID
    INNER JOIN HumanResources.Department AS D
        ON D.DepartmentID = DH.DepartmentID     
WHERE DH.EndDate IS NULL
    AND D.DepartmentID IN (12,14)
GROUP BY ROLLUP(D.Name, E.JobTitle)
--HAVING GROUPING_ID(D.Name, E.JobTitle) = 0; --All titles
--HAVING GROUPING_ID(D.Name, E.JobTitle) = 1; --Group by Name;

İşte filtre uygulanmamış sonuç kümesi.

Ad

Title

Gruplandırma düzeyi

Çalışan sayısı

Ad

Belge denetimi

Denetim uzmanı

0

2

Belge denetimi

Belge denetimi

Belge Denetim Yardımcısı

0

2

Belge denetimi

Belge denetimi

Belge Denetim Yöneticisi

0

1

Belge denetimi

Belge denetimi

NULL

1

5

Belge denetimi

Tesis ve Bakım

Tesis yönetici Yardımcısı

0

1

Tesis ve Bakım

Tesis ve Bakım

Tesis Yöneticisi

0

1

Tesis ve Bakım

Tesis ve Bakım

Janitor

0

4

Tesis ve Bakım

Tesis ve Bakım

Bakım gözetmen

0

1

Tesis ve Bakım

Tesis ve Bakım

NULL

1

7

Tesis ve Bakım

NULL

NULL

3

12

NULL

Karmaşık örnek

Aşağıdaki örnekte, GROUPING_ID() birden çok gruplandırma düzeyi gruplandırmadüzeyiçeren bir sonuç kümesi süzmek için kullanılır. Benzer bir kod gruplandırmadüzeytarafından birkaç gruplandırma düzeyleri ve görünüme filtre parametre görünümü çağıran bir saklı yordam olan bir görünümünü oluşturmak için kullanılabilir.

USE AdventureWorks2008R2;
GO
DECLARE @Grouping nvarchar(50);
DECLARE @GroupingLevel smallint;
SET @Grouping = N'CountryRegionCode Total';

SELECT @GroupingLevel = (
    CASE @Grouping
        WHEN N'Grand Total'             THEN 15
        WHEN N'SalesPerson Total'       THEN 14
        WHEN N'Store Total'             THEN 13
        WHEN N'Store SalesPerson Total' THEN 12
        WHEN N'CountryRegionCode Total' THEN 11
        WHEN N'Group Total'             THEN 7
        ELSE N'Unknown'
    END);

SELECT 
    T.[Group]
    ,T.CountryRegionCode
    ,S.Name AS N'Store'
    ,(SELECT P.FirstName + ' ' + P.LastName 
        FROM Person.Person AS P 
        WHERE P.BusinessEntityID = H.SalesPersonID)
        AS N'Sales Person'
    ,SUM(TotalDue)AS N'TotalSold'
    ,CAST(GROUPING(T.[Group])AS char(1)) + 
        CAST(GROUPING(T.CountryRegionCode)AS char(1)) + 
        CAST(GROUPING(S.Name)AS char(1)) + 
        CAST(GROUPING(H.SalesPersonID)AS char(1)) 
        AS N'GROUPING base-2'
    ,GROUPING_ID((T.[Group])
        ,(T.CountryRegionCode),(S.Name),(H.SalesPersonID)
        ) AS N'GROUPING_ID'
    ,CASE 
        WHEN GROUPING_ID(
            (T.[Group]),(T.CountryRegionCode)
            ,(S.Name),(H.SalesPersonID)
            ) = 15 THEN N'Grand Total'
        WHEN GROUPING_ID(
            (T.[Group]),(T.CountryRegionCode)
            ,(S.Name),(H.SalesPersonID)
            ) = 14 THEN N'SalesPerson Total'
        WHEN GROUPING_ID(
            (T.[Group]),(T.CountryRegionCode)
            ,(S.Name),(H.SalesPersonID)
            ) = 13 THEN N'Store Total'
        WHEN GROUPING_ID(
            (T.[Group]),(T.CountryRegionCode)
            ,(S.Name),(H.SalesPersonID)
            ) = 12 THEN N'Store SalesPerson Total'
        WHEN GROUPING_ID(
            (T.[Group]),(T.CountryRegionCode)
            ,(S.Name),(H.SalesPersonID)
            ) = 11 THEN N'CountryRegionCode Total'
        WHEN GROUPING_ID(
            (T.[Group]),(T.CountryRegionCode)
            ,(S.Name),(H.SalesPersonID)
            ) =  7 THEN N'Group Total'
        ELSE N'Error'
        END AS N'Level'
FROM Sales.Customer AS C
    INNER JOIN Sales.Store AS S
        ON C.StoreID  = S.BusinessEntityID 
    INNER JOIN Sales.SalesTerritory AS T
        ON C.TerritoryID  = T.TerritoryID 
    INNER JOIN Sales.SalesOrderHeader AS H
        ON C.CustomerID = H.CustomerID
GROUP BY GROUPING SETS ((S.Name,H.SalesPersonID)
    ,(H.SalesPersonID),(S.Name)
    ,(T.[Group]),(T.CountryRegionCode),()
    )
HAVING GROUPING_ID(
    (T.[Group]),(T.CountryRegionCode),(S.Name),(H.SalesPersonID)
    ) = @GroupingLevel
ORDER BY 
    GROUPING_ID(S.Name,H.SalesPersonID),GROUPING_ID((T.[Group])
    ,(T.CountryRegionCode)
    ,(S.Name)
    ,(H.SalesPersonID))ASC;

C.GROUPING_ID () gruplandırma düzeylerini belirlemek üzere TOPLAMASI ve KÜP ile kullanma

Aşağıdaki örnek kodda Göster kullanarak GROUPING() hesaplamak için Bit Vector(base-2) sütun.GROUPING_ID()Buna karşılık gelen hesaplamak için kullanılan Integer Equivalent sütun.sütun sırasını GROUPING_ID()işlev tarafından birleştirilmiş sütun sütun sırasını tersidir GROUPING()işlev.

Bu örneklerde, GROUPING_ID() her satır için bir değer oluşturmak için kullanılan Grouping Level sütun düzey gruplandırmatanımlamak için.Gruplandırma düzeyi her zaman (0, 1, 2,... 1 ile başlayan tamsayılar ardışık bir liste değildirn).

Not

GRUPLANDIRMA ve GROUPING_ID kullanılan n bir sonuç kümesifiltre uygulamak için HAVING yan tümce olabilir.

Paketi örnek

Bu örnekte, aşağıdaki KÜP örnekte olduğu gibi tüm gruplandırma düzeyleri görünmez.Sütunların sırasını ROLLUP listesi değişti, düzey değerleri Grouping Level sütun da değiştirilecek vardır.

USE AdventureWorks2008R2;
GO
SELECT DATEPART(yyyy,OrderDate) AS N'Year'
    ,DATEPART(mm,OrderDate) AS N'Month'
    ,DATEPART(dd,OrderDate) AS N'Day'
    ,SUM(TotalDue) AS N'Total Due'
    ,CAST(GROUPING(DATEPART(dd,OrderDate))AS char(1)) + 
        CAST(GROUPING(DATEPART(mm,OrderDate))AS char(1)) + 
        CAST(GROUPING(DATEPART(yyyy,OrderDate))AS char(1)) 
     AS N'Bit Vector(base-2)'
    ,GROUPING_ID(DATEPART(yyyy,OrderDate)
        ,DATEPART(mm,OrderDate)
        ,DATEPART(dd,OrderDate)) 
        AS N'Integer Equivalent'
    ,CASE
        WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
            ,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
            ) = 0 THEN N'Year Month Day'
        WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
            ,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
            ) = 1 THEN N'Year Month'
        WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
            ,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
            ) = 2 THEN N'not used'
        WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
            ,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
            ) = 3 THEN N'Year'
        WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
            ,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
            ) = 4 THEN N'not used'
        WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
            ,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
            ) = 5 THEN N'not used'
        WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
            ,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
            ) = 6 THEN N'not used'
        WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
            ,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
            ) = 7 THEN N'Grand Total'
    ELSE N'Error'
    END AS N'Grouping Level'
FROM Sales.SalesOrderHeader
WHERE DATEPART(yyyy,OrderDate) IN(N'2007',N'2008')
    AND DATEPART(mm,OrderDate) IN(1,2)
    AND DATEPART(dd,OrderDate) IN(1,2)
GROUP BY ROLLUP(DATEPART(yyyy,OrderDate)
        ,DATEPART(mm,OrderDate)
        ,DATEPART(dd,OrderDate))
ORDER BY GROUPING_ID(DATEPART(mm,OrderDate)
    ,DATEPART(yyyy,OrderDate)
    ,DATEPART(dd,OrderDate)
    )
    ,DATEPART(yyyy,OrderDate)
    ,DATEPART(mm,OrderDate)
    ,DATEPART(dd,OrderDate);

İşte bir kısmi sonuç kümesi.

Yıl

Ay

Günü

Toplam vade

Bit vektörü (base-2)

Tamsayı eşdeğeri

Gruplandırma düzeyi

2007

1

1

1497452.6066

000

0

Yıl ay gün

2007

1

2

21772.3494

000

0

Yıl ay gün

2007

2

1

2705653.5913

000

0

Yıl ay gün

2007

2

2

21684.4068

000

0

Yıl ay gün

2008

1

1

1908122.0967

000

0

Yıl ay gün

2008

1

2

46458.0691

000

0

Yıl ay gün

2008

2

1

3108771.9729

000

0

Yıl ay gün

2008

2

2

54598.5488

000

0

Yıl ay gün

2007

1

NULL

1519224.956

100

1

Yıl ay

2007

2

NULL

2727337.9981

100

1

Yıl ay

2008

1

NULL

1954580.1658

100

1

Yıl ay

2008

2

NULL

3163370.5217

100

1

Yıl ay

2007

NULL

NULL

4246562.9541

110

3

Yıl

2008

NULL

NULL

5117950.6875

110

3

Yıl

NULL

NULL

NULL

9364513.6416

111

7

Genel Toplam

KÜP örneği

Bu örnekte, GROUPING_ID() işlev her satır için bir değer oluşturmak için kullanılan Grouping Level sütun düzey gruplandırmatanımlamak için.

Aksine ROLLUP önceki örnekte CUBE verir tüm gruplandırma düzeyleri.Sütunların sırasını CUBE listesi değişti, düzey değerleri Grouping Level sütun da değiştirilecek vardır.

USE AdventureWorks2008R2;
GO
SELECT DATEPART(yyyy,OrderDate) AS N'Year'
    ,DATEPART(mm,OrderDate) AS N'Month'
    ,DATEPART(dd,OrderDate) AS N'Day'
    ,SUM(TotalDue) AS N'Total Due'
    ,CAST(GROUPING(DATEPART(dd,OrderDate))AS char(1)) + 
        CAST(GROUPING(DATEPART(mm,OrderDate))AS char(1)) + 
        CAST(GROUPING(DATEPART(yyyy,OrderDate))AS char(1)) 
        AS N'Bit Vector(base-2)'
    ,GROUPING_ID(DATEPART(yyyy,OrderDate)
        ,DATEPART(mm,OrderDate)
        ,DATEPART(dd,OrderDate)) 
        AS N'Integer Equivalent'
    ,CASE
        WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
            ,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
            ) = 0 THEN N'Year Month Day'
        WHEN GROUPING_ID(DATEPART(yyyy,OrderDate) 
            ,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
            ) = 1 THEN N'Year Month'
        WHEN GROUPING_ID(DATEPART(yyyy,OrderDate) 
            ,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
            ) = 2 THEN N'Year Day'
        WHEN GROUPING_ID(DATEPART(yyyy,OrderDate) 
            ,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
            ) = 3 THEN N'Year'
        WHEN GROUPING_ID(DATEPART(yyyy,OrderDate) 
            ,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
            ) = 4 THEN N'Month Day'
        WHEN GROUPING_ID(DATEPART(yyyy,OrderDate) 
            ,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
            ) = 5 THEN N'Month'
        WHEN GROUPING_ID(DATEPART(yyyy,OrderDate) 
            ,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
            ) = 6 THEN N'Day'
        WHEN GROUPING_ID(DATEPART(yyyy,OrderDate) 
            ,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
            ) = 7 THEN N'Grand Total'
    ELSE N'Error'
    END AS N'Grouping Level'
FROM Sales.SalesOrderHeader
WHERE DATEPART(yyyy,OrderDate) IN(N'2007',N'2008')
    AND DATEPART(mm,OrderDate) IN(1,2)
    AND DATEPART(dd,OrderDate) IN(1,2)
GROUP BY CUBE(DATEPART(yyyy,OrderDate)
    ,DATEPART(mm,OrderDate)
    ,DATEPART(dd,OrderDate))
ORDER BY GROUPING_ID(DATEPART(yyyy,OrderDate)
    ,DATEPART(mm,OrderDate)
    ,DATEPART(dd,OrderDate)
    )
    ,DATEPART(yyyy,OrderDate)
    ,DATEPART(mm,OrderDate)
    ,DATEPART(dd,OrderDate);

İşte bir kısmi sonuç kümesi.

Yıl

Ay

Günü

Toplam vade

Bit vektörü (base-2)

Tamsayı eşdeğeri

Gruplandırma düzeyi

2007

1

1

1497452.6066

000

0

Yıl ay gün

2007

1

2

21772.3494

000

0

Yıl ay gün

2007

2

1

2705653.5913

000

0

Yıl ay gün

2007

2

2

21684.4068

000

0

Yıl ay gün

2008

1

1

1908122.0967

000

0

Yıl ay gün

2008

1

2

46458.0691

000

0

Yıl ay gün

2008

2

1

3108771.9729

000

0

Yıl ay gün

2008

2

2

54598.5488

000

0

Yıl ay gün

2007

1

NULL

1519224.956

100

1

Yıl ay

2007

2

NULL

2727337.9981

100

1

Yıl ay

2008

1

NULL

1954580.1658

100

1

Yıl ay

2008

2

NULL

3163370.5217

100

1

Yıl ay

2007

NULL

1

4203106.1979

010

2

Yılın günü

2007

NULL

2

43456.7562

010

2

Yılın günü

2008

NULL

1

5016894.0696

010

2

Yılın günü

2008

NULL

2

101056.6179

010

2

Yılın günü

2007

NULL

NULL

4246562.9541

110

3

Yıl

2008

NULL

NULL

5117950.6875

110

3

Yıl

NULL

1

1

3405574.7033

001

4

Ay gün

NULL

1

2

68230.4185

001

4

Ay gün

NULL

2

1

5814425.5642

001

4

Ay gün

NULL

2

2

76282.9556

001

4

Ay gün

NULL

1

NULL

3473805.1218

101

5

Ay

NULL

2

NULL

5890708.5198

101

5

Ay

NULL

NULL

1

9220000.2675

011

6

Günü

NULL

NULL

2

144513.3741

011

6

Günü

NULL

NULL

NULL

9364513.6416

111

7

Genel Toplam