sintaxis - string_agg sql server 2008
TENIENDO SIN GRUPO POR (4)
"Cuando no se utiliza GROUP BY, HAVING se comporta como una cláusula WHERE". La diferencia entre dónde y tener: WHERE filtra ROWS mientras HAVING filtra grupos
SELECT SUM(spending) as totSpending
FROM militaryspending
HAVING SUM(spending) > 200000;
Resultado
totSpending
1699154.3
Más detalles, consulte https://dba.stackexchange.com/questions/57445/use-of-having-without-group-by-in-sql-queries/57453
- ¿Es posible lo siguiente según el estándar (!) SQL?
- ¿Qué cambios mínimos deben ser necesarios para cumplir con el estándar (si es que ya lo era)?
- Funciona como se espera en MySQL, si la primera fila tiene el valor máximo para NumberOfPages .
SELECT * FROM Book HAVING NumberOfPages = MAX(NumberOfPages)
Lo siguiente está escrito en el estándar:
HAVING <search condition>
- Sea G el conjunto que consta de cada columna referenciada por una <column reference> contenida en <group by cláusula>.
- Cada referencia de columna contenida directamente en la <condición de búsqueda> será una de las siguientes:
- Una referencia inequívoca a una columna que depende funcionalmente de G.
- Una referencia exterior.
¿Alguien puede explicarme, por qué debería ser posible de acuerdo con el estándar?
En MySQL, funciona perfectamente.
A pesar del resultado del validador Mimer , no creo que el suyo sea un estándar de SQL válido.
Una cláusula HAVING
sin una cláusula GROUP BY
es válida y (sin duda) una sintaxis útil en SQL estándar. Debido a que opera en la expresión de la tabla todo a la vez como un conjunto, por así decirlo, solo tiene sentido usar funciones agregadas. En tu ejemplo:
Book HAVING NumberOfPages = MAX(NumberOfPages)
no es válido porque al considerar la tabla completa, ¿a qué fila se refiere NumberOfPages
? Del mismo modo, solo tiene sentido utilizar valores literales en la cláusula SELECT
.
Considere este ejemplo, que es válido SQL estándar:
SELECT ''T'' AS result
FROM Book
HAVING MIN(NumberOfPages) < MAX(NumberOfPages);
A pesar de la ausencia de la palabra clave DISTINCT
, la consulta nunca devolverá más de una fila. Si se cumple la cláusula HAVING
entonces el resultado será una sola fila con una sola columna que contiene el valor ''T'' (lo que indica que tenemos libros con diferentes números de páginas), de lo contrario, el resultado será el conjunto vacío, es decir, cero filas con una sola columna.
Creo que la razón por la que la consulta no produce errores en mySQL se debe a las extensiones de propiedad que hacen que la cláusula HAVING
(lógicamente) surja después de la cláusula SELECT
(el comportamiento estándar es al revés), junto con el implícito GROUP BY
Cláusula mencionada en otras respuestas.
De la norma (negrita agregada de énfasis)
1) Deje que HC sea la cláusula de haber. Sea TE la expresión de tabla que contiene inmediatamente HC. Si TE no contiene inmediatamente una cláusula por grupo, entonces "GRUPO POR ()" está implícito. Sea T el descriptor de la tabla definida por el GBC contenido inmediatamente en TE y sea R el resultado de GBC.
Con la cláusula de grupo implícita, la referencia externa puede acceder a las columnas TE.
Sin embargo, la certificación de estos estándares es en gran medida una autocertificación en estos días, y el ejemplo que dio no funcionaría en todos los proveedores principales de RDBMS.
Sí. Podemos escribir la consulta SQL sin Agrupar, pero escribimos la función agregada en nuestra consulta.
select sum(Salary) from ibs having max(Salary)>1000