Contando valores no vacíos en cada columna de una tabla

Estoy buscando datos faltantes en un proyecto de migración de datos y este informe me ayudará enormemente.

Dada una tabla MySQL, me gustaría contar todos los valores vacíos (NULL o '') en cada fila de esa tabla. La salida sería una lista de nombres de columna y un recuento de filas vacías o no vacías para cada columna. Estos datos son algo que compararía manualmente con las tablas de origen, manualmente porque espero que coincidan algunos recuentos exactamente y los nombres de las columnas son completamente diferentes entre la fuente y las tablas importadas.

Tengo alrededor de 30 tablas para verificar, algunas con 100 columnas. Tengo acceso directo a MySQL desde mi PC, pero no tengo acceso para ejecutar ningún script en el servidor con la base de datos.

Ejemplo de TableA

Col1 Col2 Col3
'XX' NULL 'XX'
'XX' NULL ''
'XX' 'XX' 'XX'
'XX' ''   'XX'

El informe que me gustaría es (para recuentos no vacíos con '' contados como vacíos):

Col1: 4
Col2: 1
Col3: 3

preguntado el 27 de agosto de 11 a las 22:08

Lo resolví al final con un script PHP. Hago un bucle para cada tabla, luego hago un bucle para cada columna de la tabla, luego hago un COUNT (*) para la tabla donde la columna NO es NULL y una cadena o número no vacío. Los resultados se colocan en una tabla HTML que se copia perfectamente en una hoja de cálculo. Implica muchas consultas, pero funciona. -

En caso de que la solución sea de alguna utilidad para alguien más, la he publicado aquí: academe.co.uk/2011/08/mysql-finding-counts-of-data-by-columns (Subiré el archivo original y corregiré el resaltado de sintaxis tan pronto como averigüe cómo). -

4 Respuestas

COUNT también cuenta cadenas vacías, por lo que su consulta debería verse así:

SELECT COUNT( NULLIF( col1, '' ) ), COUNT( NULLIF( col2, '' ) ), ...

Respondido 28 ago 11, 03:08

Gracias. Al final, dividí los recuentos en una serie de consultas para facilitar la automatización (cada fila era un recuento de columnas que se podía mostrar en una celda de la tabla). - Jason

Puede utilizar la siguiente consulta para cada tabla

SELECT COUNT(*), COUNT(col1) as col1, COUNT(col2) as col2
FROM TABLE1

Para obtener todas las columnas de una tabla específica, debe ejecutar la consulta

 select column_name from information_schema.columns where TABLE_NAME='TABLE1';

Los resultados de esta consulta se pueden utilizar para consultas de generación automática como la primera.

Respondido 28 ago 11, 02:08

Podría haber mucha escritura para 100 columnas y más tablas. ;) @Jason: pero si está familiarizado con un lenguaje de scripting, puede generarlo y enviarlo usando herramientas como Heidi SQL... - Marc-Christian Schulze

Eso me da el recuento no nulo, que es un buen comienzo. Sin embargo, MySQL trata las cadenas vacías como NO NULL (a diferencia de Oracle). El sistema de destino parece usar libremente NULL y '' para significar "no hay datos aquí" en todas partes, por lo que no puedo confiar en buscar no NULL para encontrar datos migrados. Sin embargo, es un buen comienzo, y algo que podría combinar con algunas búsquedas y reemplazos en un editor de texto. - Jason

Es posible que pueda hacer un agujero en el firewall del servidor de la base de datos para poder escribir algunos scripts PHP5 en mi servidor web. Parece que no voy a poder evitar escribir esto. - Jason

¡Cuente solo las filas que tengan valores (omitiendo filas nulas / vacías)!

SELECT COUNT( NULLIF( Column_Name, '' ) ) from Table_name

Respondido el 19 de diciembre de 14 a las 20:12

esto funcionó para mí

SELECT count( NULLIF( doctor_id, '' )) as doctor_count,count( NULLIF( chemist_id, '' )) as chemistcount from table_name WHERE employee_id="20";

respondido 11 nov., 17:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.