Dela via


GROUPPARTITION (Entitets-SQL)

Returnerar en samling argumentvärden som projiceras från den aktuella grupppartitionen som aggregeringen är relaterad till. Aggregeringen GroupPartition är en gruppbaserad aggregering och har inget samlingsbaserat formulär.

Syntax

GROUPPARTITION( [ALL|DISTINCT] expression )

Argument

expression Alla entitets-SQL-uttryck.

Kommentarer

Följande fråga skapar en lista över produkter och en samling orderradskvantiteter per produkt:

SELECT p, GroupPartition(ol.Quantity) FROM LOB.OrderLines AS ol
  GROUP BY ol.Product AS p

Följande två frågor är semantiskt lika:

SELECT p, Sum(GroupPartition(ol.Quantity)) FROM LOB.OrderLines AS ol
  GROUP BY ol.Product AS p
SELECT p, Sum(ol.Quantity) FROM LOB.OrderLines AS ol
  group by ol.Product as p

Operatorn GROUPPARTITION kan användas tillsammans med användardefinierade mängdfunktioner.

GROUPPARTITION är en särskild aggregeringsoperator som innehåller en referens till den grupperade indatauppsättningen. Den här referensen kan användas var som helst i frågan där GROUP BY finns i omfånget. Till exempel:

SELECT p, GroupPartition(ol.Quantity) FROM LOB.OrderLines AS ol GROUP BY ol.Product AS p

Med en vanlig GROUP BYdöljs resultatet av gruppering. Du kan bara använda resultatet i en aggregeringsfunktion. För att kunna se resultatet av gruppering måste du korrelera resultatet av grupperingen och indatauppsättningen med hjälp av en underfråga. Följande två frågor är likvärdiga:

SELECT p, (SELECT q FROM GroupPartition(ol.Quantity) AS q) FROM LOB.OrderLines AS ol GROUP BY ol.Product AS p
SELECT p, (SELECT ol.Quantity AS q FROM LOB.OrderLines AS ol2 WHERE ol2.Product = p) FROM LOB.OrderLines AS ol GROUP BY ol.Product AS p

Som du ser i exemplet gör GROUPPARTITION-aggregeringsoperatorn det enklare att få en referens till indatauppsättningen efter gruppering.

GROUPPARTITION-operatorn kan ange ett entitets-SQL-uttryck i operatorindata när du använder parametern expression .

Till exempel är alla följande indatauttryck till grupppartitionen giltiga:

SELECT groupkey, GroupPartition(b) FROM {1,2,3} AS a INNER JOIN {4,5,6} AS b ON true GROUP BY a AS groupkey
SELECT groupkey, GroupPartition(1) FROM {1,2,3} AS a INNER JOIN {4,5,6} AS b ON true GROUP BY a AS groupkey
SELECT groupkey, GroupPartition(a + b) FROM {1,2,3} AS a INNER JOIN {4,5,6} AS b ON true GROUP BY a AS groupkey
SELECT groupkey, GroupPartition({a + b}) FROM {1,2,3} AS a INNER JOIN {4,5,6} AS b ON true GROUP BY a AS groupkey
SELECT groupkey, GroupPartition({42}) FROM {1,2,3} AS a INNER JOIN {4,5,6} AS b ON true GROUP BY a AS groupkey
SELECT groupkey, GroupPartition(b > a) FROM {1,2,3} AS a INNER JOIN {4,5,6} AS b ON true GROUP BY a AS groupkey

Exempel

I följande exempel visas hur du använder GROUPPARTITION-satsen med GROUP BY-satsen. GROUP BY-satsen grupperar SalesOrderHeader entiteter efter deras Contact. GROUPPARTITION-satsen projicerar TotalDue sedan egenskapen för varje grupp, vilket resulterar i en samling decimaler.

USING Microsoft.Samples.Entity
Function MyAvg(dues Collection(Decimal)) AS
(
    Avg(SELECT value due FROM dues AS due WHERE due > @price)
)
SELECT TOP(10) contactID, MyAvg(GroupPartition(order.TotalDue)) 
FROM AdventureWorksEntities.SalesOrderHeaders AS order 
GROUP BY order.Contact.ContactID AS contactID;