Condividi tramite


GROUPPARTITION (Entity SQL)

Restituisce una raccolta di valori di argomento che sono estratti dalla partizione di gruppo corrente alla quale è correlata l'aggregazione. L'aggregazione GroupPartition è un'aggregazione basata sul gruppo e non ha un formato basato sulla raccolta.

Sintassi

GROUPPARTITION( [ALL|DISTINCT] expression )

Argomenti

expression Qualsiasi espressione Entity SQL.

Osservazioni:

Nella query seguente viene prodotto un elenco di prodotti e una raccolta di quantità nelle righe degli ordini per ogni prodotto:

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

Le due query seguenti sono semanticamente uguali:

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

L'operatore GROUPPARTITION può essere usato insieme a funzioni di aggregazione definite dall'utente.

GROUPPARTITION è un operatore di aggregazione speciale che mantiene un riferimento al set di input raggruppato. Questo riferimento può essere usato ovunque nella query laddove GROUP BY è nell'ambito. Ad esempio:

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

Se si usa un operatore GROUP BY normale, i risultati del raggruppamento vengono nascosti. È possibile usare solo i risultati in una funzione di aggregazione. Per vedere i risultati del raggruppamento, è necessario correlarli al set di input tramite una sottoquery. Le due query seguenti sono equivalenti:

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

Come illustrato nell'esempio, grazie all'operatore di aggregazione GROUPPARTITION diventa più semplice ottenere un riferimento al set di input dopo il raggruppamento.

L'operatore GROUPPARTITION può specificare qualsiasi espressione Entity SQL nell'operatore di input quando si usa il parametro expression.

Tutte le espressioni di input seguenti alla partizione di gruppo sono valide:

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

Esempio

Nell'esempio seguente viene mostrato come usare la clausola GROUPPARTITION con la clausola GROUP BY. La clausola GROUP BY raggruppa entità SalesOrderHeader in base a Contact. La clausola GROUPPARTITION proietta quindi la proprietà TotalDue per ogni gruppo, creando così una raccolta di numeri decimali.

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;