IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Compter champs null


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 185
    Points : 160
    Points
    160
    Par défaut Compter champs null
    Bonjour,

    J'ai une table ayant plus d'une soixantaine de colonnes.
    J'aimerai savoir si il est possible et comment compter le nombre de champ NULL ou " " par enregistrements.
    Le problème c'est que je voudrais éviter de faire une requête par colonne ou une requête énorme à cause d'un WHERE et ma soixantaine de champs.
    J'ai pas mal cherché, mais je sèche complètement la-dessus.
    Merci bien à vous.
    Cordialement.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Il n'y a pas d'automatisme pour ce genre d'opération, mais vous pouvez néanmoins vous appuyer sur le catalogue de votre SGBD pour générer la requête, ce sera certainement moins pénible.

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 185
    Points : 160
    Points
    160
    Par défaut
    Peux-tu m'en dire plus ?
    J'utilise MySQL.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Il faut utiliser la vue columns de information_schema.

    Vous pouvez écrire une requête du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CONCAT('sum(CASE WHEN ', COLUMN_NAME, ' IS NULL OR ',  COLUMN_NAME, ' = '' '' THEN 1 ELSE 0 END) as NB_NULL_OF_', COLUMN_NAME, ',') as req
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE table_name = <votre_table>
    Après vous faites un copier coller du résultat et vous le complétez pour que ça fonctionne.

  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 185
    Points : 160
    Points
    160
    Par défaut
    Copier-coller du résultat puis je le complète ?
    Pas très bien compris ta réponse

  6. #6
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 185
    Points : 160
    Points
    160
    Par défaut
    Ta requête ne fonctionne pas. Elle me retourne une colonne req avec le contenu du concat()

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Montrez nous la requête exacte que vous avez lancée, et le résultat complet que vous obtenez.
    Précisez également la version de MySQL utilisée.

    En principe, cette requête devrait vous renvoyer une suite de sum(CASE ... ), un pour chaque colonne de la table concernée. Et vous n'avez qu'à y ajouter SELECT au début et FROM à la fin pour obtenir votre requête finale (enlevez aussi la virgule à la fin du dernier sum).

    EDIT : par contre, après relecture de votre premier message, vous semblez plutot chercher le nombre de colonnes NULL pour chaque ligne. Or, cette requete donnera pour chaque colonne le nombre de ligne où elle est à NULL. Si c'est le cas, vous pouvez tout de même vous en inspirer pour construire la requête adaptée.

  8. #8
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 185
    Points : 160
    Points
    160
    Par défaut
    Je dois faire une requête renvoyant le nombre de colonnes à NULL, vide ou ' ' par enregistrements.
    Donc si j'ai 60 colonnes, mon enregistrement ayant 50 champs à vide, la requête renverra 50.
    Le serveur MySQL est sur une machine de test (MySQL 5.1) mais je peux l'upgrader sans problème, de plus une fois sur machine de prod., la dernière version y sera installée.

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Honnêtement, où bloquez-vous avec la méthode que je vous ai indiqué ?
    Comme l'a dit Snipah, il suffit de l'adapter pour trouver ce que vous désirez (en l'occurence, changer les "sum" par des "+").

    On veut bien aider, mais il faut aussi que vous cherchiez un minimum !

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Une table avec 60 colonnes dont 50 peuvent être nulles ou vides pour une ligne ?
    Y'aurait pas comme un problème de modélisation des données là !

    Si fsmrel passe par là, il va sortir sa mitraillette pour éliminer le bonhomme NULL !

    Elle stocke quoi cette table ?
    Pourquoi y a t-il tant de colonnes et surtout pourquoi peut-il y avoir autant de colonnes à NULL ou vides ?

  11. #11
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 185
    Points : 160
    Points
    160
    Par défaut
    C'est la base de donnée d'un site + application.
    Elle répertorie des informations de plusieurs centaines de magasins d'une grande entreprise.
    Malheureusement, il n'y a du avoir aucune modélisation, je ne fais que passer après quelqu'un qui a mal fait son boulot.
    Le SQL n'étant pas mon point fort (je suis plutôt dév. web), je dois récupérer le nombre de champs incomplets par magasins.

    En vous remerciant pour votre patience et pour votre aide.

  12. #12
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Là tout de suite je ne trouve pas de solution en SQL.

    Ce que je ferais, dans un programme en php ou autre langage :
    1) Récupération des données de la table
    Si j'ai bien compris, il y a une ligne par magasin ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT *
    FROM laTable
    3) Pour chaque ligne résultat
    a) Initialiser compteur à zéro
    b) Pour chaque colonne
    - Si colonne identifiant le magasin ==> enregistrer magasin dans variable
    - Sinon si colonne est vide ==> incrémenter compteur
    Fin Pour chaque colonne
    c) Afficher magasin et compteur
    Fin Pour chaque ligne résultat

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Ca semble possible en une requête, puisqu'on parle de magasins, on va admettre que votre table s'appelle magasin avec un identifiant id_magasin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
           id_magasin,
           CASE WHEN col1 IS NULL OR col1 = '' THEN 1 ELSE 0 END 
           + CASE WHEN col2 IS NULL OR col2 = '' THEN 1 ELSE 0 END 
           + CASE ...
           AS nb_colonnes_nulles
    FROM magasin
    Pour construire la suite de CASE à additionner sans vous fatiguer, inspirez vous de ce qu'a posté Waldar :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT CONCAT('+ CASE WHEN ', COLUMN_NAME, ' IS NULL OR ',  COLUMN_NAME, ' = '''' THEN 1 ELSE 0 END') AS req
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE table_name = 'magasin'
    AND column_name <> 'id_magasin'
    Vous n'aurez plus qu'à copier coller chaque ligne dans votre requête, en enlevant le + de la première ligne.

  14. #14
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 185
    Points : 160
    Points
    160
    Par défaut
    Tout d'abord, merci à tous pour votre précieux temps.
    N'est-il pas possible d'integrer la requete construisant la suite de CASE dans la requête principale ?
    Merci encore à vous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compter les champs nulls
    Par LDPDC dans le forum Oracle
    Réponses: 3
    Dernier message: 07/05/2009, 10h59
  2. Réponses: 6
    Dernier message: 17/06/2005, 14h40
  3. Pb Jointure reflexive et champ NULL
    Par VincentR dans le forum SQL
    Réponses: 8
    Dernier message: 19/01/2005, 14h14
  4. INSTR sur un champ vide, Detecter un champ null
    Par rodolphedj dans le forum ASP
    Réponses: 4
    Dernier message: 06/09/2004, 15h24
  5. Selectionner un champs null
    Par maadadi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/02/2004, 14h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo