GROUP BY (Entity SQL)

Określa grupy, do których mają zostać umieszczone obiekty zwracane przez wyrażenie zapytania (SELECT).

Składnia

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

Argumenty

aliasedExpression Każde prawidłowe wyrażenie zapytania, na którym jest wykonywane grupowanie. expression może być właściwością lub wyrażeniem niegregowanym, które odwołuje się do właściwości zwracanej przez klauzulę FROM. Każde wyrażenie w klauzuli GROUP BY musi obliczyć typ, który można porównać pod kątem równości. Te typy są zazwyczaj typami pierwotnymi skalarnych, takimi jak liczby, ciągi i daty. Nie można grupowania według kolekcji.

Uwagi

Jeśli funkcje agregujące znajdują się na liście> select klauzuli <SELECT, funkcja GROUP BY oblicza wartość podsumowania dla każdej grupy. Po określeniu wartości GROUP BY każda nazwa właściwości w dowolnym wyrażeniu innym niżaggregate na liście wyboru powinna być uwzględniona na liście GROUP BY lub wyrażenie GROUP BY musi dokładnie odpowiadać wyrażeniu listy wyboru.

Uwaga

Jeśli klauzula ORDER BY nie jest określona, grupy zwracane przez klauzulę GROUP BY nie są w żadnej określonej kolejności. Aby określić określoną kolejność danych, zalecamy, aby zawsze używać klauzuli ORDER BY.

Po określeniu klauzuli GROUP BY jawnie lub niejawnie (na przykład przez klauzulę HAVING w zapytaniu) bieżący zakres jest ukryty i wprowadzany jest nowy zakres.

Klauzula SELECT, klauzula HAVING i klauzula ORDER BY nie będą już mogły odwoływać się do nazw elementów określonych w klauzuli FROM. Można odwoływać się tylko do wyrażeń grupowania. W tym celu można przypisać nowe nazwy (aliasy) do każdego wyrażenia grupowania. Jeśli dla wyrażenia grupowania nie określono aliasu, program Entity SQL próbuje wygenerować jeden przy użyciu reguł generowania aliasów, jak pokazano w poniższym przykładzie.

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

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

Wyrażenia w klauzuli GROUP BY nie mogą odwoływać się do nazw zdefiniowanych wcześniej w tej samej klauzuli GROUP BY.

Oprócz grupowania nazw można również określić agregacje w klauzuli SELECT, klauzuli HAVING i klauzuli ORDER BY. Agregacja zawiera wyrażenie, które jest oceniane dla każdego elementu grupy. Operator agregacji zmniejsza wartości wszystkich tych wyrażeń (zwykle, ale nie zawsze, w jedną wartość). Wyrażenie agregacji może odwoływać się do oryginalnych nazw elementów widocznych w zakresie nadrzędnym lub do dowolnej z nowych nazw wprowadzonych przez samą klauzulę GROUP BY. Mimo że agregacje są wyświetlane w klauzuli SELECT, klauzuli HAVING i klauzuli ORDER BY, są one faktycznie oceniane w tym samym zakresie co wyrażenia grupowania, jak pokazano w poniższym przykładzie.

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

FROM orderLines as o

GROUP BY o.Product as name

To zapytanie używa klauzuli GROUP BY do utworzenia raportu kosztów wszystkich produktów uporządkowanych według produktu. Podaje nazwę name produktu jako część wyrażenia grupowania, a następnie odwołuje się do tej nazwy na liście SELECT. Określa również agregację sum na liście SELECT, która wewnętrznie odwołuje się do ceny i ilości wiersza zamówienia.

Każde wyrażenie GROUP By key musi mieć co najmniej jedno odwołanie do zakresu wejściowego:

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

Aby zapoznać się z przykładem użycia funkcji GROUP BY, zobacz HAVING (POSIADANIE).

Przykład

Następujące zapytanie Entity SQL używa operatora GROUP BY do określania grup, do których obiekty są zwracane przez zapytanie. Zapytanie jest oparte na modelu AdventureWorks Sales. Aby skompilować i uruchomić to zapytanie, wykonaj następujące kroki:

  1. Postępuj zgodnie z procedurą w temacie Instrukcje: Wykonywanie zapytania zwracającego wyniki Typ pierwotny.

  2. Przekaż następujące zapytanie jako argument do ExecutePrimitiveTypeQuery metody :

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

Zobacz też