2017-12-01 3 views
0

so würde halte ich mich auf SQL Server wirklich neu, so dass die weniger verwendeten Schlüsselwörter wie HAVING und COUNT() usw. Also, wenn ich diesen Fehler habe:SQL Server: mit verwendet COUNT WHERE

An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.

Ich war wirklich verwirrt bis zum letzten Bit. "Eine Auswahlliste?" "Spalte aggregiert ist eine äußere Referenz?" Kann das jemand in Laiensprache erklären?

+0

Can:

SELECT A, B, C FROM Table T WHERE A = (SELECT MAX(D) FROM Table T2 WHERE T2.A = T.A) --Valid, MAX(D) is an outer reference to another table we call T2 SELECT A, B, C FROM Table T WHERE A = MAX(D) --Invalid 

Die HAVING Version etwas so sein würde Sie posten Ihre Anfrage? Eine SELECT-Liste ist nur eine Unterabfrage, die normalerweise mit IN verwendet wird, dh WHERE STATE in (select state from everyable) – SqlACID

+0

Ich habe gerade eine Abfrage mit 'COUNT' mit' WHERE' gemacht, um die Fehlermeldung anzuzeigen und 'COUNT' besser zu verstehen Einschränkungen. Es gab kein spezifisches Problem, das ich lösen wollte. Ich habe die Nachricht einfach nicht verstanden. –

Antwort

0

Die SELECT-Liste ist

SELECT a, b, c ... <=== this list of expressions after SELECT 

Ein äußere Referenz ist eine Spalte der umgebenden Abfrage, auf die in einer Unterabfrage verwiesen wird. Dies ist eindeutig hier erklärt: Aggregates with an Outer Reference

Beachten Sie, dass die WHERE-Klausel vor angewendet wird Gruppierung (mit GROUP BY) und die HAVING-Klausel nach Gruppierung. Daher können die Aggregatfunktionen in der HAVING-Klausel, aber nicht in der WHERE-Klausel erscheinen.

SELECT customer_id, COUNT(*) as number_of_orders, SUM(amount) AS total_amount 
FROM cust_orders 
WHERE year(order_date) = 2017  -- filters records before grouping. 
GROUP BY customer_id    -- groups while counting and summing up. 
HAVING COUNT(*) > 2    -- count is available here. 

Hiermit werden alle Kundenaufträge des Jahres 2017 ausgewählt und die Summen pro Kunde berechnet. Nur Kunden mit mehr als 2 Bestellungen in diesem Jahr werden zurückgegeben.

0

Im Grunde, was er sagt, ist, dass Sie dies nicht tun können:

WHERE COUNT(ColumnA) = 100 

Sie benötigen einen HAVING nach dem GROUP BY:

SELECT COUNT(ColumnA) AS CountA, ColumnB, ColumnC 
FROM Table 
GROUP BY ColumnB, ColumnC 
HAVING COUNT(ColumnA) = 100 
1

Es ist im Grunde sagen Sie eine Unterabfrage verwenden müssen, die eine andere Tabelle verweist, wenn Sie Aggregate in diesen Orten verwenden möchten:

SELECT A, 
     B, 
     C 
FROM Table T 
GROUP BY A, 
     B, 
     C 
HAVING COUNT(*) > (SELECT MAX(D) FROM Table T2) --Valid 

SELECT A, 
     B, 
     C 
FROM Table T 
GROUP BY A, 
     B, 
     C 
HAVING COUNT(*) > MAX(D) --Invalid