> Faqs > Contar los registros que tienen dos campos con valor repetido y sumarlos

Contar los registros que tienen dos campos con valor repetido y sumarlos

Hola,

Tengo una tabla donde están registrados muchas personas y quiero hacer un listado donde me indique solo el apellido y el número de veces que se repite usando solo las columnas del primer apellido y del segundo apellido

Con una sola columna, la del primer apellido (Apellido1), si me sale:

SELECT COUNT(Apellido1), Apellido1
FROM fichas
where Apellido1 is not null AND Apellido1 !=''
GROUP BY Apellido1
ORDER BY COUNT( Apellido1 ) DESC

Si hago lo mismo pero usando la columna del segundo apellido (Apellido2), tambien funciona.

Pero no consigo que MsSQL me dé un resultado correcto sumando los apellidos de las dos columnas (Apellido1 y Apellido2)

¿Cómo podria ser la consulta MySQL correcta?

Gracias

Respuestas

En primer lugaf cambiaria el operador != por el correcto que es <>. Luego crearia sendas variables @Count1 y @Count2 y les asigno los count de cada consulta y luego muestro su suma.

Sergio
5 1

Tienes usar la clausula having de SQL y hacer una concatenación de los nombres y apellidos, o de los dos apellidos en tu caso. Eso en MySQL lo consigues con la función concat(), pero podría cambiar en otros motores de bases de datos.

Creo que lo que buscas sería más o menos un SQL como el siguiente.

select 
    concat(nombre, ' ', apellidos), 
    count(*) as contador 
from 
    usuario 
group by 
    nombre, 
    apellidos 
having 
    count(*) > 1 
Julian
1147 49 87 46
Hola Julian. Ante todo gracias por ayudarme. Tu respuesta no me sirve, me cuenta con CONCAT más de una columna como si fuera una.

Si haces la suma de cada parte del apellido y despues una union, y lo sumas?, mas o menos asi:

SELECT SUM(count) SUMA ,apellido
FROM (
SELECT COUNT(Apellido1) as count, Apellido1 as apellido
FROM fichas
where Apellido1 is not null AND Apellido1 !=''
GROUP BY Apellido1
union
SELECT COUNT(Apellido2) as count, Apellido2 as apellido
FROM fichas
where Apellido2 is not null AND Apellido2 !=''
GROUP BY Apellido2
)

GROUP BY apellido

ORDER BY SUMA DESC
Juan Antonio
5 1

Hola Francisco

Espero que esto te sirva al menos para orientarte

SELECT
    columna1, columna2
    count(*) as mi_contador
FROM
    mitabla
WHERE
    loquesea = algo
GROUP BY
    columna1, columna2

Saludos

David
95 4 11

Hola. no me sirve la respuesta de David pues el resultado muestra las dos columnas y toma las diferencias.

He adactado el codigo con mis datos así:

SELECT Apellido1, Apellido2,  count(*) as mi_contador 
FROM fichas
WHERE Apellido1 is not null AND Apellido1 !='' AND Apellido2 is not null AND Apellido2 !=''
GROUP BY Apellido1, Apellido2
ORDER BY COUNT( Apellido1 ) DESC

Pero no hace lo que necesito. Ver en una sola columna los apellidos y en una segunda el número de veces que esos se repiten sumando la veces que aperecen en las dos columnas.

Francisco
4 2

El resultado que deseo obtener son 2 columnas, 1 con el apellido y otro con el nº de veces que se repite contando que los apellidos los tengo separados en 2 columnas de 1º apellido y 2º apellido. Como ejemplo podria decir que mi apellido Moreno como 1º apellido en mi familia se repite 13 veces, y como 2º apellido se repite otras 13,luego quiero que me diga en la 1º columna 'Moreno' y en la 2º '26', etc..

Francisco
4 2