2011-09-12 11 views
117

Alguien me envió una consulta SQL donde la cláusula GROUP BY consistía en la instrucción: GROUP BY 1.¿Qué significa la cláusula de SQL "GROUP BY 1"?

Esto debe ser un error tipográfico ¿verdad? Ninguna columna recibe el alias 1. ¿Qué podría significar? ¿Tengo razón en suponer que esto debe ser un error tipográfico?

+2

No es un error tipográfico, es la primera columna de su conjunto de resultados – Lamak

+5

Tenga en cuenta que esta sintaxis no es portátil. Se comportará de forma diferente en bases de datos distintas de mysql. En Oracle, por ejemplo, se trata como una constante. –

+2

@RussellReed Sí. desafortunadamente (ya que usar un alias a veces es muy útil) ansi sql no permite la agrupación por columna ordinal. La razón es que el grupo pasa antes de la proyección. Pero luego ... qué cuando tenemos expresiones de agrupamiento con decenas de líneas ... terminamos con .. * mutiples * de decenas de líneas en la declaración sql final. – javadba

Respuesta

128

Significa agrupar en la primera columna independientemente de cómo se llame. Puede hacer lo mismo con ORDER BY.

8

Será grupo por primer campo en la cláusula select

32
SELECT account_id, open_emp_id 
     ^^^^  ^^^^ 
      1   2 

FROM account 
GROUP BY 1; 

En consulta GROUP BY 1 anterior se refiere al first column in select statement que es account_id.

También puede especificar en ORDER BY.

Note : The number in ORDER BY and GROUP BY always start with 1 not with 0. 
17

Además de agrupar por nombre de campo, también puede agrupar por ordinal, o colocar el campo es.

Esto generalmente no se aconseja si se está agrupando en algo específico, ya que la estructura de la tabla/vista puede cambiar; además, es más difícil de leer (crédito: Yuck). Sin embargo, si devuelve un conjunto único de algo, entonces está bien.

+5

+1 para "no hacer esto" y agregaría que la mejor razón para evitarlo es que no es legible. – Yuck

1

Agrupará por la posición de columna que coloque después de la cláusula group by.

por ejemplo si ejecuta 'SELECT SALESMAN_NAME, SUM(SALES) FROM SALES GROUP BY 1' se agruparán por SALESMAN_NAME.

Un riesgo al hacerlo es que si ejecuta 'Select *' y por alguna razón vuelve a crear la tabla con columnas en un orden diferente, le dará un resultado diferente al esperado.

0

Eso significa Grupo de SQL por primera columna en la cláusula select, que siempre utilice este GROUP BY 1 junto con ORDER BY 1, además también se puede utilizar como esto GROUP BY 1,2,3.., por supuesto que es conveniente para nosotros pero hay que prestar atención a que la condición el resultado puede no ser el que desea si alguien ha modificado sus columnas de selección, y no se visualiza