Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Estatísticas com Tcl e Mysql


O que você precisa aqui é uma consulta SQL um pouco elaborada. Ela será composta de subconsultas.

O primeiro é este (violino ). Dá-lhe o número total de itens de porta aberta para cada nome.
 SELECT COUNT(*) total, name FROM stats GROUP BY name

O próximo é este (violino ). Dá-lhe o número de aberturas por porta e nome.
SELECT COUNT(*) bydoor, name, door FROM stats GROUP BY name, door

O terceiro (violino ) incorpora o segundo e fornece uma linha para cada nome, mostrando as portas abertas.
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, você precisa de um JOIN para unir essas subconsultas, neste formulário.
   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

Tudo escrito parece com isso (fiddle ). Você coloca em seu sql variável e você está pronto para ir. É apenas uma string de várias linhas.
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}

Portanto, há uma consulta feita de várias consultas aninhadas.

Existem alguns truques aqui para você aprender à medida que se aprimora na análise de dados SQL.
  1. uso de GROUP BY
  2. aninhamento de consultas, também conhecido como subconsultas. Você pode pensar em subconsultas como tabelas virtuais.
  3. (avançado) GROUP_CONCAT .