sql >> Base de Datos >  >> RDS >> Mysql

Estadísticas Con Tcl Y Mysql

Lo que necesita aquí es una consulta SQL ligeramente elaborada. Estará compuesto por subconsultas.

El primero es este (fiddle ). Obtiene el número total de artículos abiertos para cada nombre.

 SELECT COUNT(*) total, name FROM stats GROUP BY name

El siguiente es este (fiddle ). Te da el número de aperturas por puerta y nombre.

SELECT COUNT(*) bydoor, name, door FROM stats GROUP BY name, door

El tercero (fiddle ) incorpora el segundo y obtiene una línea para cada nombre, mostrando la puerta que se abre.

SELECT name, 
       GROUP_CONCAT(CONCAT(bydoor,'X',' door ', door) ORDER BY bydoor DESC) details
  FROM (   SELECT COUNT(*) bydoor,
                  name,
                  door
             FROM stats
            GROUP BY name, door
        ) s
  GROUP BY name

Finalmente, necesita un JOIN para unir esas subconsultas, de esta forma.

   SELECT t.name, t.total, d.details
     FROM ( .... the first subquery ....) t
     JOIN ( .... the second subquery .... ) d ON t.name = d.name
    ORDER BY t.total DESC, t.name

Todo explicado se ve así (fiddle ). Lo pones en tu sql variable y listo. Es solo una cadena de varias líneas.

set sql {SELECT t.name, t.total, d.details
  FROM (SELECT COUNT(*) total, name FROM stats GROUP BY name) t
  JOIN (  SELECT name, 
                 GROUP_CONCAT(CONCAT(bydoor,'X',' door ', door) ORDER BY bydoor DESC) details
            FROM (   SELECT COUNT(*) bydoor,
                            name,
                            door
                       FROM stats
                      GROUP BY name, door
                 ) s
           GROUP BY name
        ) d ON t.name = d.name
  ORDER BY t.total DESC, t.name}

Así que hay una consulta hecha de un montón de consultas anidadas.

Aquí hay algunos trucos que puede aprender a medida que mejora en el análisis de datos SQL.

  1. uso de GROUP BY
  2. Anidamiento de consultas, también conocido como subconsultas. Puede pensar en las subconsultas como tablas virtuales.
  3. (avanzado) GROUP_CONCAT .