En las consultas SQL, usamos la cláusula Agrupar por para aplicar funciones agregadas.

  • Pero, ¿cuál es el propósito de usar un valor numérico en lugar del nombre de la columna con la cláusula Agrupar por? Por ejemplo: Agrupar por 1.

Comentarios

  • Use order by 1 solo cuando esté sentado en el indicador mysql> . En el código, use ORDER BY id ASC. Tenga en cuenta el caso, el nombre de campo explícito y la dirección de orden explícita.

Respuesta

Este es realmente un mal algo que hacer en mi humilde opinión, y no es compatible con la mayoría de las otras plataformas de bases de datos.

Las razones por las que la gente lo hace:

  • son perezosos – No sé por qué la gente piensa que su productividad mejora escribiendo código conciso en lugar de escribir 40 milisegundos adicionales para obtener un código mucho más literal.

Las razones por las que es malo:

  • no es autodocumentado : alguien tendrá que analizar la lista SELECT para averiguar la agrupación. En realidad, sería un poco más claro en SQL Server, que no admite vaquero que- agrupaciones sabe-qué-pasará como lo hace MySQL.

  • es frágil : alguien entra y cambia la lista SELECT porque los usuarios empresariales querían una salida de informe diferente, y ahora su salida es un desastre. Si ha utilizado nombres de columna en GROUP BY, el orden en la lista SELECT sería irrelevante.

SQL Server admite ORDER BY [ordinal]; aquí hay algunos argumentos paralelos en contra de su uso:

Respuesta

MySQL le permite hacer GROUP BY con alias ( Problemas con los alias de las columnas ). Esto sería mucho mejor que hacer GROUP BY con números.

Google tiene muchos ejemplos de su uso y por qué muchos han dejado de usarlo.

Para ser honesto, no he «usado números de columna para ORDER BY y GROUP BY desde 1996 (estaba haciendo Oracle PL / SQL Development en ese momento). El uso de números de columna es realmente para los veteranos y la compatibilidad con versiones anteriores permite a dichos desarrolladores usar MySQL y otros RDBMS que aún lo permite.

Respuesta

Considere el siguiente caso:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Apps | 1 | | 2016-05-31 | Applications | 1 | | 2016-05-31 | Applications | 1 | | 2016-05-31 | Apps | 1 | | 2016-05-31 | Videos | 1 | | 2016-05-31 | Videos | 1 | | 2016-06-01 | Apps | 3 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Videos | 2 | | 2016-06-01 | Apps | 2 | +------------+--------------+-----------+ 

Debe averiguar la cantidad de descargas por servicio por día considerando las aplicaciones y las aplicaciones como el mismo servicio. Agrupar por date, services daría como resultado que Apps y Applications se consideren servicios separados.

En ese caso, la consulta sería:

 select date, services, sum(downloads) as downloads from test.zvijay_test group by date,services 

Y Salida:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 2 | | 2016-05-31 | Apps | 2 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Apps | 5 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+ 

Pero esto no es lo que desea, ya que las aplicaciones y las aplicaciones se agrupan es el requisito. Entonces, ¿qué podemos hacer?

Una forma es reemplazar Apps con Applications usando un CASE expresión o la función IF y luego agruparlos por servicios como:

select date, if(services="Apps","Applications",services) as services, sum(downloads) as downloads from test.zvijay_test group by date,services 

Pero esto aún agrupa los servicios que consideran Apps y Applications como servicios diferentes y da el mismo resultado que antes:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 2 | | 2016-05-31 | Applications | 2 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Applications | 5 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+ 

Agrupar sobre un número de columna le permite agrupar datos en una columna con alias.

select date, if(services="Apps","Applications",services) as services, sum(downloads) as downloads from test.zvijay_test group by date,2; 

Y por lo tanto, le da la salida deseada como se muestra a continuación:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 4 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 9 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+ 

I «ve leído muchas veces que esta es una forma perezosa de escribir consultas o agrupar sobre una columna con alias no funciona en MySQL, pero esta es la forma de agrupar sobre columnas con alias.

Esta no es la forma preferida de escribir consultas, úsela solo cuando realmente necesita agrupar en una columna con alias.

Comentarios

  • » Pero esto aún agrupa los servicios que consideran las aplicaciones y las aplicaciones como servicios diferentes y da el mismo resultado que antes «.¿No ‘ t esto se resolvería si ‘ ha elegido un nombre diferente (no conflictivo) para el alias?
  • @ Daddy32 Exactamente mi pensamiento. O incluso anidar una vez más (agrupar después de seleccionar)

Responder

No hay ninguna razón válida para usarlo. Es simplemente un atajo perezoso especialmente diseñado para dificultarle a un desarrollador en apuros descubrir su agrupación o clasificación más adelante o para permitir que el código falle miserablemente cuando alguien cambia el orden de las columnas. Sea considerado con sus compañeros desarrolladores y no lo haga.

Respuesta

Esto funcionó para mí. El código agrupa los filas hasta 5 grupos.

SELECT USR.UID, USR.PROFILENAME, ( CASE WHEN MOD(@curRow, 5) = 0 AND @curRow > 0 THEN @curRow := 0 ELSE @curRow := @curRow + 1 /*@curRow := 1*/ /*AND @curCode := USR.UID*/ END ) AS sort_by_total FROM SS_USR_USERS USR, ( SELECT @curRow := 0, @curCode := "" ) rt ORDER BY USR.PROFILENAME, USR.UID 

El resultado será el siguiente

ingrese la descripción de la imagen aquí

Respuesta

SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2; SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2,3; 

Considere las consultas anteriores: Agrupar por 1 significa agrupar por la primera columna y agrupar por 1,2 medios para agrupar por la primera y segunda columna y agrupar por 1,2,3 medios para agrupar por la primera segunda y tercera columna. Por ejemplo:

agrupar por 1,2

esta imagen muestra las dos primeras columnas agrupadas por 1,2, es decir, no está considerando los diferentes valores de dep_date para encontrar el recuento (para calcular el recuento se tienen en cuenta todas las combinaciones distintas de las dos primeras columnas) mientras que la segunda consulta da como resultado agrupar por 1,2,3

imagen. Aquí está considerando las primeras tres columnas y hay diferentes valores para encontrar el recuento, es decir, está agrupando por las primeras tres columnas (para calcular el recuento se toman en consideración todas las combinaciones distintas de las primeras tres columnas).

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *