Sdílet prostřednictvím


GROUPPARTITION (Entity SQL)

Vrátí kolekci hodnot argumentů, které jsou promítané mimo aktuální oddíl skupiny, ke kterému agregace souvisí. Agregace GroupPartition je agregace založená na skupinách a nemá žádný formulář založený na kolekci.

Syntaxe

GROUPPARTITION( [ALL|DISTINCT] expression )

Argumenty

expression Libovolný výraz Entity SQL.

Poznámky

Následující dotaz vytvoří seznam produktů a kolekci množství řádků objednávek pro každý produkt:

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

Následující dva dotazy jsou sémanticky stejné:

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

Operátor GROUPPARTITION lze použít ve spojení s uživatelem definovanými agregačními funkcemi.

GROUPPARTITION je speciální agregační operátor, který obsahuje odkaz na seskupenou vstupní sadu. Tento odkaz lze použít kdekoli v dotazu, kde je GROUP BY v oboru. Příklad:

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

Při pravidelném GROUP BYseskupení jsou výsledky seskupení skryté. Výsledky můžete použít pouze v agregační funkci. Abyste viděli výsledky seskupení, musíte korelovat výsledky seskupení a vstupní sady pomocí poddotazu. Následující dva dotazy jsou ekvivalentní:

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

Jak je vidět v příkladu, agregační operátor GROUPPARTITION usnadňuje získání odkazu na vstupní sadu po seskupení.

Operátor GROUPPARTITION může při použití parametru zadat libovolný výraz Entity SQL ve vstupu operátoru expression .

Například všechny následující vstupní výrazy pro oddíl skupiny jsou platné:

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

Příklad

Následující příklad ukazuje, jak používat klauzuli GROUPPARTITION s klauzulí GROUP BY. Klauzule GROUP BY seskupuje SalesOrderHeader entity podle jejich Contact. Klauzule GROUPPARTITION pak zakážou TotalDue vlastnost pro každou skupinu, což vede k kolekci desetinných míst.

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;