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