2011-01-06 18 views
32

Necesito ayuda para enderezar algo, sé que es una pregunta muy fácil pero es algo que me está confundiendo un poco en SQL.GROUP BY/función agregada confusión en SQL

Esta consulta SQL arroja un error 'no una expresión GROUP BY' en Oracle. Entiendo por qué, ya que sé que una vez que agrupe por un atributo de una tupla, ya no puedo acceder a ningún otro atributo.

SELECT * 
FROM order_details 
GROUP BY order_no 

Sin embargo esto se hace trabajar

SELECT SUM(order_price) 
FROM order_details 
GROUP BY order_no 

Sólo al hormigón mi entendimiento en este .... Suponiendo que hay múltiples tuplas en order_details para cada orden que se hace, una vez que los grupos de tuplas de acuerdo con order_no, todavía puedo acceder al atributo order_price para cada tupla individual en el grupo, pero solo usando una función agregada?

En otras palabras, las funciones agregadas cuando se usan en la cláusula SELECT pueden profundizar en el grupo para ver los atributos 'ocultos', donde simplemente usar 'SELECT order_no' arrojará un error?

Gracias por su ayuda para aclarar esto, he tenido dificultades para encontrar una respuesta a esta pregunta específica en Google.

Chris

Respuesta

34

En SQL estándar (pero no MySQL), cuando se utiliza GROUP BY, debe enumerar todas las columnas de resultados que no son agregados en la cláusula GROUP BY. Entonces, si order_details tiene 6 columnas, entonces debe listar las 6 columnas (por nombre - no puede usar * en las cláusulas GROUP BY u ORDER BY) en la cláusula GROUP BY.

También puede hacer:

SELECT order_no, SUM(order_price) 
    FROM order_details 
GROUP BY order_no; 

que trabajará porque todas las columnas no agregadas se enumeran en la cláusula GROUP BY.

Se podría hacer algo como:

SELECT order_no, order_price, MAX(order_item) 
    FROM order_details 
GROUP BY order_no, order_price; 

Esta consulta no es realmente significativo (o más probablemente no es significativo), pero será 'trabajo'. Enumerará cada número de orden por separado y la combinación de precio de orden, y dará el artículo de orden máximo (número) asociado con ese precio. Si todos los artículos en un pedido tienen precios distintos, terminará con grupos de una fila cada uno. OTOH, si hay varios artículos en el pedido al mismo precio (digamos 0,99 € cada uno), los agrupará y devolverá el número máximo de artículos a ese precio. (Supongo que la tabla tiene una clave principal en (order_no, order_item) donde el primer artículo en el pedido tiene order_item = 1, el segundo elemento es 2, etc.)

+0

Bien, entonces después de que se ejecuta GROUP BY, todas las tuplas individuales para un order_no en particular todavía son accesibles por las funciones agregadas. Es decir, la función SUMA aún puede acceder al atributo order_price de cada tupla, aun cuando esas tuplas se hayan agrupado juntas por order_no? – Chris

+5

@Chris: sí, más o menos. Puede pensar en GROUP BY dividiendo las filas de la tabla en grupos; cada grupo tiene el mismo conjunto de valores para las columnas enumeradas en la cláusula GROUP BY. Los agregados luego operan en cualquiera de las columnas especificadas, con el agregado calculado sobre las filas en el grupo. El resultado consiste entonces en una fila por grupo, con los valores de la columna GROUP BY más los agregados asociados. Hummm ... Espero que esté claro ... –

+0

Sí, eso está completamente despejado hasta donde yo sé. Muchas gracias Jonathan y gracias a los otros chicos que respondieron! – Chris

0

Para usar la cláusula group by debe mencionar todas las columnas de select enunciado en agrupar por cláusula pero no en la columna de función agregada.

Para hacer esto en lugar de agrupar puede usar cláusula de partición por, puede usar solo un puerto para agrupar como una partición.

también puede hacerlo como partición 1

0
SELECT * 
FROM order_details 
GROUP BY order_no 

En la consulta anterior está seleccionando todas las columnas debido a que su lanzando un error agrupar por algo así .. para evitar que se tiene que mencionar todas las columnas en cualquier instrucción de selección todas las columnas deben estar en el grupo por la cláusula ..

SELECT * 
    FROM order_details 
    GROUP BY order_no,order_details,etc 

etc que significa que todas las columnas de la tabla order_details.

Cuestiones relacionadas