sql >> Base de Datos >  >> RDS >> SQLite

Combine SQLite Count() con GROUP BY para agregar una columna "Count" a su conjunto de resultados

Si necesita agregar una columna de "recuento" al conjunto de resultados de una consulta de base de datos cuando usa SQLite, puede usar count() función para proporcionar el conteo, y el GROUP BY cláusula para especificar la columna para la cual agrupar los resultados.

Ejemplo

Aquí hay un ejemplo rápido para demostrarlo.

SELECT ArtistId, count(Title)
FROM Album
GROUP BY ArtistId
LIMIT 10;

Resultado:

ArtistId    count(Title)
----------  ------------
1           2           
2           2           
3           1           
4           1           
5           1           
6           2           
7           1           
8           3           
9           1           
10          1           

En este caso, el ID de cada artista se incluye en ArtistId. columna, y el número de álbumes de ese artista aparece en el recuento (Título) columna.

Para que esto sea un poco más fácil de leer, aquí hay una consulta similar, pero esta vez devuelvo el nombre del artista en lugar de la identificación. Hago esto realizando una unión interna con el Artista mesa.

En este caso, agrego un WHERE cláusula para devolver solo aquellos artistas que comiencen con la letra D .

SELECT 
  ar.Name, 
  count(al.Title)
FROM Album al
INNER JOIN Artist ar
ON ar.ArtistId = al.ArtistId
WHERE ar.Name LIKE 'D%'
GROUP BY ar.Name;

Resultado:

Name             count(al.Title)
---------------  ---------------
David Coverdale  1              
Deep Purple      11             
Def Leppard      1              
Dennis Chambers  1              
Djavan           2              
Dread Zeppelin   1              

Ordenar por conteo()

Podemos modificar esto ligeramente para que el conjunto de resultados esté ordenado por conteo. En otras palabras, podemos ordenarlo para que los artistas con más álbumes aparezcan primero y viceversa.

SELECT 
  ar.Name, 
  count(al.Title)
FROM Album al
INNER JOIN Artist ar
ON ar.ArtistId = al.ArtistId
WHERE ar.Name LIKE 'D%'
GROUP BY ar.Name
ORDER BY count(al.Title) DESC;

Resultado:

Name                  count(al.Title)
--------------------  ---------------
Deep Purple           11             
Djavan                2              
David Coverdale       1              
Def Leppard           1              
Dennis Chambers       1              
Dread Zeppelin        1              

En realidad, podemos ir un paso más allá y agregar un alias para el count() . Esto nos evitará tener que duplicar eso en el ORDER BY cláusula.

SELECT 
  ar.Name, 
  count(al.Title) AS AlbumCount
FROM Album al
INNER JOIN Artist ar
ON ar.ArtistId = al.ArtistId
WHERE ar.Name LIKE 'D%'
GROUP BY ar.Name
ORDER BY AlbumCount DESC;

Resultado:

Name                  AlbumCount
--------------------  ----------
Deep Purple           11        
Djavan                2         
David Coverdale       1         
Def Leppard           1         
Dennis Chambers       1         
Dread Zeppelin        1