7
votes

SQL: Nombre de valeurs distinctes dans chaque colonne

J'ai besoin d'une requête qui retournera une table où chaque colonne est le nombre de valeurs distinctes dans les colonnes d'une autre table.

Je sais comment compter les valeurs distinctes dans une colonne: P>

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


6 commentaires

C'est la solution élégante et la plus simple ... Voulez-vous dire «donné un nom de table, donnez-moi des comptes distincts pour chaque colonne de cette table»?


Quelle base de données utilisez-vous?


Dupliquer possible: Stackoverflow.com/Questtions/1330692/distion- paire de valeurs-sql


@Will, cette question est distincte de cette question.


Distinctement différent, il semble aussi.


GBN, votre retraitement de ma question est juste sur. Raj, j'utilise mysql.


6 Réponses :


3
votes

Ce code devrait vous donner toutes les colonnes de 'Table1' avec le nombre de valeur distincte respectif pour chacun en tant que données.

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)


0 commentaires

1
votes

et c'est codé dur.

Il ne s'agit pas de codage d'une liste de champs pour une instruction SQL. C'est une pratique courante et acceptable.


4 commentaires

... Au fur et à mesure de la création programmatique de la SQL, à ce poste (fournissant à vos utilisateurs ne fournit jamais les valeurs que vous avez installées - FINE dans cette question, vous avez la liste des colonnes quelque part).


Si j'allais coder-Gen, certains SQL, et si j'étais sur MSQLServer, je vérifierais des sysobjects et des syscolonnes.


Si vous souhaitez écrire le code de manière plus portable, vous devez choisir parmi informations_schema.tables et informations_schema.columns, plutôt que de sélectionner à partir de SysObjects et de SysColumns.


Ce que je voudrais faire est de trouver le nombre de valeurs distinctes dans chaque colonne sans connaissance des noms de colonne. Je peux voir comment utiliser information_schema.tables serait utile ici (j'utilise MySQL.) Vous allez donc générer la requête en fonction de la table Info_schema.Tables plutôt que de rédiger une requête qui trouve les noms de colonne, les groupes par eux, et compte ensuite les valeurs? Cela devrait fonctionner assez bien.



-3
votes

distinct est mauvais. Comptage / groupe par


4 commentaires

Veuillez qualifier cela avec plus d'informations. Comment utiliser le mal distinct par rapport à la comptage / groupe par?


Se comporte de manière distincte avec des jeux de données plus grands et de la plate-forme à la plate-forme. Tout du moins selon moi. Je trouve que le regroupement des résultats est plus prévisible, en particulier si vous faites face à des données codées différemment, UTF, etc.


Je vais devoir examiner en utilisant le groupe par.


Compter / Grouper ne ferait que le nombre distinct pour une seule colonne. Pour les colonnes A et B, vous vous retrouverez avec deux SELECTS, car Select A, B, Count (*) de ... Groupe par A, B vous donnerait des comptes de la paire distincte (A, B) et non distincts A et Distinct B. L'OP est sur la bonne voie avec le nombre (distinct A), compte (distinct B)



0
votes

Ce ne sera pas nécessairement possible pour chaque domaine d'une table. Par exemple, vous ne pouvez pas faire un distinct sur un champ SQL Server Ntext ou un champ d'image, à moins que vous ne les jetais à d'autres types de données et perdez une certaine précision.


1 commentaires

Bon point. Je ne devrais pas avoir à m'inquiéter à ce sujet. Les champs ne seront que du texte ou des chiffres.



4
votes

Essayez ceci (syntaxe SQL Server 2005): xxx

sortie: xxx


1 commentaires

Requête simple pour aider à générer le vôtre sans douleur: Sélectionnez 'Row_Number () sur (Partition par' + Colonne + 'Commande par' + Colonne + ') As' + Column_Name + 'Rank,', 'Somme (case quand "+" Rang = 1 puis 1 autre 0 extrémité) as '+ colonne_name +' DistingCount, 'de l'information_schema.columns où table_name = "OcTable";



-1
votes

J'apprécie toutes les réponses. Je pense que la solution qui fonctionnera le mieux pour moi dans cette situation (comptant le nombre de valeurs distinctes dans chaque colonne d'une table d'un programme externe qui n'a aucune connaissance de la table, à l'exception de son nom) est la suivante:

Run "Décrivez la table1" et retirez les noms de colonne du résultat.

boucle à travers les noms de colonne et créer la requête pour compter les valeurs distinctes dans chaque colonne. La requête ressemblera à quelque chose comme "Sélectionner le nombre (colonne distincte), le compte (colonne distincte), ... de table1".


0 commentaires