Sdílet prostřednictvím


GROUP BY (Entity SQL)

Určuje skupiny, do kterých se mají umístit objekty vrácené výrazem dotazu (SELECT).

Syntaxe

[ GROUP BY aliasedExpression [ ,...n ] ]

Argumenty

aliasedExpression Libovolný platný výraz dotazu, na kterém se provádí seskupení. expression může být vlastnost nebo neagregační výraz, který odkazuje na vlastnost vrácenou klauzulí FROM. Každý výraz v klauzuli GROUP BY musí být vyhodnocen jako typ, který lze porovnat s rovností. Tyto typy jsou obecně skalární primitivy, jako jsou čísla, řetězce a kalendářní data. Kolekci nelze seskupit.

Poznámky

Pokud jsou agregační funkce zahrnuté do seznamu> select klauzule <SELECT, funkce GROUP BY vypočítá souhrnnou hodnotu pro každou skupinu. Pokud je zadána funkce GROUP BY, musí být každý název vlastnosti v libovolném neaggregovaném výrazu v seznamu select zahrnut do seznamu GROUP BY nebo výraz GROUP BY musí přesně odpovídat výrazu select list.

Poznámka:

Pokud klauzule ORDER BY není zadaná, skupiny vrácené klauzulí GROUP BY nejsou v žádném konkrétním pořadí. Pokud chcete určit konkrétní pořadí dat, doporučujeme vždy použít klauzuli ORDER BY.

Pokud je zadaná klauzule GROUP BY( explicitně nebo implicitně (například klauzulí HAVING v dotazu), aktuální obor je skrytý a zavádí se nový obor.

Klauzule SELECT, klauzule HAVING a klauzule ORDER BY již nebudou moci odkazovat na názvy prvků zadané v klauzuli FROM. Můžete odkazovat jenom na samotné výrazy seskupení. Uděláte to tak, že každému výrazu seskupení přiřadíte nové názvy (aliasy). Pokud pro výraz seskupení není zadán žádný alias, entity SQL se pokusí ho vygenerovat pomocí pravidel generování aliasů, jak je znázorněno v následujícím příkladu.

SELECT g1, g2, ...gn FROM c as c1

GROUP BY e1 as g1, e2 as g2, ...en as gn

Výrazy v klauzuli GROUP BY nemohou odkazovat na názvy definované dříve ve stejné klauzuli GROUP BY.

Kromě názvů seskupení můžete také zadat agregace v klauzuli SELECT, klauzuli HAVING a klauzuli ORDER BY. Agregace obsahuje výraz, který se vyhodnocuje pro každý prvek skupiny. Agregační operátor zmenšuje hodnoty všech těchto výrazů (obvykle, ale ne vždy, do jedné hodnoty). Agregační výraz může odkazovat na původní názvy elementů viditelné v nadřazené oblasti nebo na jakýkoli nový název představený samotnou klauzulí GROUP BY. I když se agregace zobrazují v klauzuli SELECT, KLAUZULI HAVING a ORDER BY, jsou ve skutečnosti vyhodnoceny ve stejném rozsahu jako seskupovací výrazy, jak je znázorněno v následujícím příkladu.

SELECT name, sum(o.Price * o.Quantity) as total

FROM orderLines as o

GROUP BY o.Product as name

Tento dotaz používá klauzuli GROUP BY k vytvoření sestavy nákladů na všechny produkty seřazené podle produktu. Tento název name dává produktu jako součást výrazu seskupení a odkazuje na tento název v seznamu SELECT. Určuje také agregaci sum v seznamu SELECT, která interně odkazuje na cenu a množství řádku objednávky.

Každý výraz GROUP By key musí mít alespoň jeden odkaz na vstupní obor:

SELECT FROM Persons as P
GROUP BY Q + P   -- GOOD
GROUP BY Q   -- BAD
GROUP BY 1   -- BAD, a constant is not allowed

Příklad použití funkce GROUP BY najdete v tématu HAVING.

Příklad

Následující dotaz Entity SQL používá operátor GROUP BY k určení skupin, do kterých jsou objekty vráceny dotazem. Dotaz je založený na prodejním modelu AdventureWorks. Chcete-li tento dotaz zkompilovat a spustit, postupujte takto:

  1. Postupujte podle pokynů v části Postupy: Provedení dotazu, který vrací výsledky PrimitiveType.

  2. Jako argument metody ExecutePrimitiveTypeQuery předejte následující dotaz:

SELECT VALUE name FROM AdventureWorksEntities.Products 
    AS P GROUP BY P.Name HAVING MAX(P.ListPrice) > @price

Viz také