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ş.
Sözdizimi
GROUPING_ID ( <column_expression>[ ,...n ] )
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:
|
|
Ö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 |