varios valores traer repetir repetidos registros mostrar eliminar duplicados distintos diferente contar consulta condicion agrupar sql mysql count distinct

traer - sql diferente de varios valores



SQL: contar el nĂºmero de valores distintos en cada columna (6)

y está codificado.

No es hardcoding para proporcionar una lista de campo para una declaración sql. Es práctica común y aceptable.

Necesito una consulta que devuelva una tabla donde cada columna es el recuento de valores distintos en las columnas de otra tabla.

Sé cómo contar los distintos valores en una columna:

select count(distinct columnA) from table1;

Supongo que podría hacer de esto una cláusula de selección realmente larga:

select count(distinct columnA), count(distinct columnB), ... from table1;

pero eso no es muy elegante y está codificado. Prefiero algo más flexible.


DISTINCT es malo Hacer COUNT / GROUP BY


Esto no necesariamente será posible para cada campo en una tabla. Por ejemplo, no puede hacer una DISTINCT contra un ntext o campo de imagen de SQL Server a menos que los envíe a otros tipos de datos y pierda algo de precisión.


intente esto (sintaxis sql server 2005):

DECLARE @YourTable table (col1 varchar(5) ,col2 int ,col3 datetime ,col4 char(3) ) insert into @YourTable values (''abcdf'',123,''1/1/2009'',''aaa'') insert into @YourTable values (''aaaaa'',456,''1/2/2009'',''bbb'') insert into @YourTable values (''bbbbb'',789,''1/3/2009'',''aaa'') insert into @YourTable values (''ccccc'',789,''1/4/2009'',''bbb'') insert into @YourTable values (''aaaaa'',789,''1/5/2009'',''aaa'') insert into @YourTable values (''abcdf'',789,''1/6/2009'',''aaa'') ;with RankedYourTable AS ( SELECT ROW_NUMBER() OVER(PARTITION by col1 order by col1) AS col1Rank ,ROW_NUMBER() OVER(PARTITION by col2 order by col2) AS col2Rank ,ROW_NUMBER() OVER(PARTITION by col3 order by col3) AS col3Rank ,ROW_NUMBER() OVER(PARTITION by col4 order by col4) AS col4Rank FROM @YourTable ) SELECT SUM(CASE WHEN col1Rank=1 THEN 1 ELSE 0 END) AS col1DistinctCount ,SUM(CASE WHEN col2Rank=1 THEN 1 ELSE 0 END) AS col2DistinctCount ,SUM(CASE WHEN col3Rank=1 THEN 1 ELSE 0 END) AS col3DistinctCount ,SUM(CASE WHEN col4Rank=1 THEN 1 ELSE 0 END) AS col4DistinctCount FROM RankedYourTable

SALIDA:

col1DistinctCount col2DistinctCount col3DistinctCount col4DistinctCount ----------------- ----------------- ----------------- ----------------- 4 3 6 2 (1 row(s) affected)


Aprecio todas las respuestas. Creo que la solución que funcionará mejor para mí en esta situación (contar el número de valores distintos en cada columna de una tabla de un programa externo que no tiene conocimiento de la tabla, excepto su nombre) es la siguiente:

Ejecute "describe table1" y extraiga los nombres de las columnas del resultado.

Pasa por los nombres de las columnas y crea la consulta para contar los valores distintos en cada columna. La consulta se verá algo así como "select count (distinct columnA), count (distinct columnB), ... from table1".


Este código debe darle todas las columnas en ''tabla1'' con el recuento de valores distintivos respectivos para cada uno como datos.

DECLARE @TableName VarChar (Max) = ''table1'' DECLARE @SqlString VarChar (Max) set @SqlString = ( SELECT DISTINCT ''SELECT '' + RIGHT (ColumnList, LEN (ColumnList)-1) + '' FROM '' + Table_Name FROM INFORMATION_SCHEMA.COLUMNS COL1 CROSS AppLy ( SELECT '', COUNT (DISTINCT ['' + COLUMN_NAME + '']) AS '' + '''''''' + COLUMN_NAME + '''''''' FROM INFORMATION_SCHEMA.COLUMNS COL2 WHERE COL1.TABLE_NAME = COL2.TABLE_NAME FOR XML PATH ('''') ) TableColumns (ColumnList) WHERE 1=1 AND COL1.TABLE_NAME = @TableName ) EXECUTE (@SqlString)