operadores funciones funcion ejemplos datos consultas clausulas agrupar agrupamiento agrupadas agregado agregacion sql oracle

funciones - GROUP BY/confusión de función agregada en SQL



funciones de agregado sql ejemplos (3)

Necesito un poco de ayuda para enderezar algo, sé que es una pregunta muy fácil pero es algo que me está confundiendo un poco 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, este funciona

SELECT SUM(order_price) FROM order_details GROUP BY order_no

Solo para concretizar mi comprensión sobre esto ... Suponiendo que hay múltiples tuplas en order_details para cada orden que se realiza, una vez que agrupo las tuplas según 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 utilizan 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


En SQL estándar (pero no en MySQL), cuando usa GROUP BY, debe listar 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 puedes hacer:

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

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

Podrías 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 significativa (o probablemente no sea significativa), pero "funcionará". 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 (order_no, order_item) donde el primer elemento del pedido tiene order_item = 1 , el segundo elemento es 2, etc.)


Para usar la cláusula group by, debe mencionar todas las columnas de la instrucción select en la cláusula group by pero no la columna de la función aggregate.

PARA HACER ESTO EN LUGAR DE GRUPO PUEDES UTILIZAR PARTICIPACIÓN POR CLAUSULA PUEDES UTILIZAR UN SOLO PUERTO PARA AGRUPAR COMO UNA PARTICIÓN.

también puede hacerlo como partición en 1


SELECT * FROM order_details GROUP BY order_no

En la consulta anterior está seleccionando todas las columnas debido a que está arrojando un error no agrupado por algo así ... para evitar que tenga que mencionar todas las columnas, cualquiera que sea la declaración seleccionada, todas las columnas deben estar en la cláusula group by.

SELECT * FROM order_details GROUP BY order_no,order_details,etc

etc significa todas las columnas de la tabla order_details.