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

Requêtes MySQL Discussion :

Pourcentage de champs NULL par enregistrement


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Sage CRM, Talend Open Studio, Jasper Report
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Sage CRM, Talend Open Studio, Jasper Report
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Pourcentage de champs NULL par enregistrement
    Bonjour,

    J'ai une demande un peu compliquée et je n'ai pas le niveau en SQL pour réussir à trouver la réponse.

    Voilà, je dois trouver une requête qui va m'indiquer le % de champs dont la valeur est NULL par enregistrement (ligne) dans une table.

    Si vous avez une idée, je prends.

    Un grand merci d'avance !!!!

    A+

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Bonjour,

    Votre question n'est pas très claire. Ce que vous voulez, c'est le pourcentage de valeurs NULL dans une colonne donnée ?
    Si ce n'est pas ça, pouvez-vous reformuler votre besoin, peut-être avec un exemple ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Sage CRM, Talend Open Studio, Jasper Report
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Sage CRM, Talend Open Studio, Jasper Report
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Merci pour votre réponse et pour clarifier ma demande, voici un peu plus d'explications.

    J'ai une requête du type select id_table,a,b,c,d from table.

    je dois déterminer le % de champS ( a,b,c,d ) qui sont null par ligne de résultat sans prendre en compte l'id_table.

    ligne 1 : id_table=1 , a=1,b=null,c=2,d=null donc 50% de null
    ligne 2: id_table=2, a=null,b=null,c=null,d=1 donc 75% de null

    etc ...

    J'espère que c'est un peu plus compréhensible.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT 
            id_table
        ,     CASE WHEN a IS NULL THEN 25 ELSE 0 END
            + CASE WHEN b IS NULL THEN 25 ELSE 0 END
            + CASE WHEN c IS NULL THEN 25 ELSE 0 END
            + CASE WHEN d IS NULL THEN 25 ELSE 0 END
            AS PourcentageNull
    FROM LaTable

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Sage CRM, Talend Open Studio, Jasper Report
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Sage CRM, Talend Open Studio, Jasper Report
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Oui , un peu comme ça sauf qu'il y a beaucoup de champ dans cette table et j'aurai juste voulu une fonction ou autre pour me permettre d'éviter de taper ça à la main

    de plus , il se peut que je soit obligé de faire la même chose pour d'autres tables.

    j'avais déjà la requête comme tu le proposes.Juste que ,si j'ajoute un champ ou en supprime un , c'est un peu lourd à maintenir.

    il faudrait avoir une boucle qui va compter le nb de champ ( donc le %) dans une table ( via les tables systèmes ? je connais pas bien cette partie) et créer dans une variable pour générer "case when" et finalement la requête globale. ensuite,il faut pouvoir identifié le champ id et l'exclure de la partie pourcentage. Je connais pas très bien les fonctions en mysql mais je suppose que l'on peut donner des paramètres dans la function pour indiquer le champ id à exclure.

    en tout cas merci pour ta réponse.

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Normalement, il n'est pas courant d'ajouter ou de supprimer des colonnes..


    Vous pouvez vous inspirer de ça pour écrire votre requête, il ne reste plus qu'a compléter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select  
    	concat('+ CASE WHEN ' , COLUMN_NAME , ' IS NULL THEN 1 ELSE 0 END' ) AS S
    from information_schema.columns
    where table_name = 'LaTable'
    and column_key <> 'PRI'

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Sage CRM, Talend Open Studio, Jasper Report
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Sage CRM, Talend Open Studio, Jasper Report
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Oui, je sais bien que ce n'est pas "courant" mais cela se fait, donc il faut que la requête soit la plus dynamique possible.

    Je vais tester ta requête dès que je peux.

    Désolé pour l'attente mais vacances pendant 15 jours et je reprends 4 jours et re-vacances pour une semaine.

    A+ et merci

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Sage CRM, Talend Open Studio, Jasper Report
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Sage CRM, Talend Open Studio, Jasper Report
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    la requête marche nickel et j'aurai juste besoin de mettre à jour une variable au lieu d'indiquer que le champ = 1 ou 0.

    genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT concat('CASE WHEN ' , COLUMN_NAME , ' IS NULL THEN NB=NB+1  END AS ',COLUMN_NAME ) AS concat 
    FROM information_schema.COLUMNS 
    WHERE table_name = table AND column_key <> 'PRI'
    sauf que je n'arrive pas à déclarer ma constante.

    A+ et bon week-end.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Sage CRM, Talend Open Studio, Jasper Report
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Sage CRM, Talend Open Studio, Jasper Report
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Y a rien a faire, je n'arrive pas à trouver de solution. si quelqu'un peut m'aider.

    Merci d'avance.

  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
    fsmrel dirait que le bonhomme NULL est interdit au Relationland !

    Votre besoin laisse supposer une mauvaise conception de votre BDD, surtout quand vous dites que vous pouvez être amené à ajouter des colonnes, en laissant supposer qu'elles peuvent être envahies de bonshommes NULL !

    Est-il trop tard pour modifier votre modèle de données ?
    Qu'est-ce qui justifie la présence de tous ces NULL ?

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Sage CRM, Talend Open Studio, Jasper Report
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Sage CRM, Talend Open Studio, Jasper Report
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Désolé de vous décevoir mais une table peut évoluer et retirer ou ajouter un champ. Ce n'est pas courant mais tout a fait possible sinon une table est complètement statique et ne peut pas évoluer ? je suis développeur (et ancien consultant dans la gestion de la relation client ) pour une société qui gère des indices boursiers dans l'immobilier France et Europe donc quand les règles de calcul changent et que des nouveaux champs doivent être intégrés je ne vois trop comment faire à part ajouter le champ ou donner ma démission,lol

    bref, ma demande était de savoir ce qui est null ou pas pour une table X avec Y colonne(s) de cette table X et d'indiquer le taux de null.

    Pourquoi ?

    - si nous demandons des informations à nos client ,adhérents ou autres et que c'est valeurs ne sont presques pas,peu ou jamais retournées. ils nous faut le savoir et analyser pourquoi ces informations ne sont pas retournées.

    - cela me permet de savoir le taux de remplissage d'un formulaire avec les colonnes obligatoires pour nos calculs mais non obligatoire en saisie sur les formulaires ( je sais ce que vous allez dire mais bon j'ai pas le choix !!!! )

    Voili Voilo

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Sage CRM, Talend Open Studio, Jasper Report
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Sage CRM, Talend Open Studio, Jasper Report
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    désolé pour les fautes !!! je suis à la bourre , je vais louper mon train.

    Bonne soirée à vous

  13. #13
    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 est complètement statique et ne peut pas évoluer ?
    Ben en principe, un modèle de données n'évolue que si les besoins applicatifs évoluent.

    gère des indices boursiers dans l'immobilier France et Europe donc quand les règles de calcul changent et que des nouveaux champs doivent être intégrés je ne vois trop comment faire à part ajouter le champ ou donner ma démission,lol
    Évolution des besoins donc évolution du modèle de données... si nécessaire ! Mais encore une fois, laisser vos tables se faire envahir par des bonshommes NULL est contre-productif.
    Vous ne donnez pas de détails sur votre modèle de données alors il est difficile de vous aider pour l'améliorer.
    Si vous avez la possibilité de revoir votre modèle de données, intéressez vous à la modélisation par métadonnées qui pourrait peut-être répondre au besoin de l'ajout de colonnes actuel... sans en ajouter.

    bref, ma demande était de savoir ce qui est null ou pas pour une table X avec Y colonne(s) de cette table X et d'indiquer le taux de null.
    Une piste vous a été donnée par aieeeuuuuu et d'après vous, la requête qu'il a donnée fonctionne.

    - si nous demandons des informations à nos client ,adhérents ou autres et que c'est valeurs ne sont presques pas,peu ou jamais retournées. ils nous faut le savoir et analyser pourquoi ces informations ne sont pas retournées.

    - cela me permet de savoir le taux de remplissage d'un formulaire avec les colonnes obligatoires pour nos calculs mais non obligatoire en saisie sur les formulaires ( je sais ce que vous allez dire mais bon j'ai pas le choix !!!! )
    Ceci me confirme qu'effectivement, votre modèle de données serait à revoir.
    Si je comprends bien, vous avez des formulaires qui contiennent plus ou moins de champs ou bien les réponses données via ces formulaires sont plus ou moins complètes.
    Pour simplifier, imaginons un formulaire F1 comprenant les champs C1, C2 et C3. Cela pourrait être modélisé ainsi, en supposant qu'un champ ne peut apparaître que dans un seul formulaire...

    Règle de gestion :
    Un formulaire est composé de un à plusieurs champs et un champ entre dans la composition d'un seul formulaire.

    MCD :
    formulaire -1,n----composer----(1,1)- champ

    Nota : les cardinalités (1,1) entre parenthèses signifient une identification relative. Imaginez le formulaire papier ; si vous détruisez le formulaire, les champs aussi sont détruits. Le champ ne peut exister sans le formulaire, c'est un morceau du formulaire donc il est pertinent d'identifier le champ relativement à son formulaire.

    Tables :
    te_formulaire_frm (frm_id, frm_titre...)
    te_champ_chp (chp_id_formulaire, chp_numéro, chp_nom...)

    Contenu des tables :
    te_formulaire_frm
    frm_id, frm_titre
    1, 'F1'
    ...

    te_champ_chp
    chp_id_formulaire, chp_numéro, chp_nom
    1, 1, 'C1'
    1, 2, 'C2'
    1, 3, 'C3'
    ...

    Maintenant, imaginons que le formulaire F1 soit rempli par les clients Toto et Titi...

    Règles de gestion :
    Un client peut remplir un à plusieurs formulaires et un formulaire peut être rempli par plusieurs client.
    Sur un formulaire, un client peut renseigner plusieurs champs et un champ de formulaire peut être renseigné par plusieurs clients.

    MCD :
    client -0,n----remplir----0,n- formulaire -1,n----composer----(1,1)- champ
    |-----------------------------------------0,n- renseigner -0,n-------------------------------------------------|

    Nota :
    Il faudrait ici représenter une contrainte d'inclusion signifiant que le champ renseigné doit entrer dans la composition du formulaire rempli mais ce n'est pas évident sur un schéma en format texte.

    Tables :
    te_client_clt (clt_id, clt_nom...)
    tj_clt_remplir_frm_crf (crf_id_client, crf_id_formulaire, crf_date...)
    tj_clt_renseigner_chp_crc (crc_id_client, crc_id_formulaire, crc_numero_champ, crc_valeur)

    Supposons que le client Toto remplisse complètement le formulaire mais pas le client Titi...

    Contenu des tables :
    te_client_clt
    clt_id, clt_nom
    1, 'Toto'
    2, 'Titi'
    ...

    tj_clt_remplir_frm_crf
    crf_id_client, crf_id_formulaire, crf_date
    1, 1, '2014-10-15'
    2, 1, '2014-10-16'
    ...

    tj_clt_renseigner_chp_crc
    crc_id_client, crc_id_formulaire, crc_numero_champ, crc_valeur
    1, 1, 1, 'Valeur1'
    1, 1, 2, 'Valeur2'
    1, 1, 3, 'Valeur3'
    2, 1, 1, 'Valeur A'
    2, 1, 3, 'Valeur B'

    Nota :
    On voit ci-dessus que le client 2 n'a pas renseigné le champ 2 du formulaire 1.

    Cherchons maintenant, pour chaque formulaire rempli, le pourcentage de champs non renseignés...

    1) Combien de champs par formulaire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT c.chp_id_formulaire,
    	COUNT(*) AS nb_champs
    FROM te_champ_chp c
    GROUP BY c.chp_id_formulaire
    2) Combien de champs renseignés par les clients dans chaque formulaire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT cl.clt_id, c.clt_nom,
    	f.frm_id, f.frm_titre,
    	r1.crc_date
    	COUNT(*) AS nb_champs_renseignes
    FROM te_client_clt cl
    INNER JOIN tj_clt_renseigner_chp_crc r1 ON r1.crc_id_client = cl.clt_id
    	INNER JOIN te_champ_chp ch 
    		ON ch.chp_id_formulaire = r1.crc_id_formulaire
    		AND ch.chp_numero = r1.crc_numero_formulaire
    		INNER JOIN te_formulaire_frm f ON f.frm_id = ch.chp_id_formulaire
    GROUP BY cl.clt_id, c.clt_nom,f.frm_id, f.frm_titre, r1.crc_date
    3) Taux de non remplissage par client et formulaire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    SELECT cl.clt_id, c.clt_nom,
    	f.frm_id, f.frm_titre,
    	r1.crc_date
    	COUNT(*) AS nb_champs_renseignes,
    	100 * (tmp.nb_champs - COUNT(*)) / tmp.nb_champs AS Pourcentage_champs_non_renseignes
    FROM te_client_clt cl
    INNER JOIN tj_clt_renseigner_chp_crc r1 ON r1.crc_id_client = cl.clt_id
    	INNER JOIN te_champ_chp ch 
    		ON ch.chp_id_formulaire = r1.crc_id_formulaire
    		AND ch.chp_numero = r1.crc_numero_formulaire
    		INNER JOIN te_formulaire_frm f ON f.frm_id = ch.chp_id_formulaire
    			INNER JOIN
    			(
    				SELECT c.chp_id_formulaire,
    					COUNT(*) AS nb_champs
    				FROM te_champ_chp c
    				GROUP BY c.chp_id_formulaire
    			) tmp ON tmp.chp_id_formulaire = f.frm_id
    GROUP BY cl.clt_id, c.clt_nom,f.frm_id, f.frm_titre, r1.crc_date
    Aucun NULL dans les tables.
    On peut ajouter autant de formulaires, autant de champs qu'on veut.
    On n'enregistre que les réponses données par les clients dans les champs de formulaires.
    La requête permettant de connaitre le taux de non réponse n'est pas très complexe.

    Maintenant, vous faites ce que vous voulez.

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Sage CRM, Talend Open Studio, Jasper Report
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Sage CRM, Talend Open Studio, Jasper Report
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Je vous rappelle que votre solution est hors sujet et ce n'est pas ce que je recherche.

    Je suis au courant que le modèle de données n'est pas structurée correctement et qu'il faudrait utiliser des meta data ce qui éviterait de modifier la table mais comme j'ai dit j'ai pas le choix. la base de données a été réalisé par X personne et y a pas de doc ( et pourquoi faire simple quand on peut faire compliquer). Il me faudrait avoir du temps pour revoir tout ça et j'en ai pas pour ce projet.

    je sais que les null c'est null (pas bien ou comme vous voulez) mais les clients ne communiquent pas toujours l'info (int ou double pour 99% des col) et je peux pas remplacer par 0 dans le cas ou c'est null car cela veut juste dire que nous n'avons pas l'info et surtout pas que cette valeur est à 0.

    Oui j'ai dit que la requete par aieeeuuuuu mais ensuite j'ai demandé si possible de m'aider car elle ne répondait pas complètement à ma demande.

    j'ai pas besoin de cour sur les bases de données j'avais juste besoin de pouvoir répondre à un besoin.

    donc si vous voulez m'aider vous pouvez.Je fais avec les moyens du bord et les priorités à gérer. On ne fait toujours ce que l'on veut , surtout quand on est pas le patron.

    PS: Ce que vous dites est intéressant mais je le sais déjà vous ne m'apprenez rien.

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

Discussions similaires

  1. Remplir champ NULL par du contenu dans un INSERT
    Par Devilstuff dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/02/2010, 23h49
  2. Nombre de champ NULL ds enregistrement/ligne
    Par fikou dans le forum VB.NET
    Réponses: 4
    Dernier message: 16/01/2008, 17h52
  3. Entité avec champs à null retournée par Hibernate
    Par nicdo77 dans le forum Hibernate
    Réponses: 2
    Dernier message: 13/09/2007, 16h47
  4. Réponses: 6
    Dernier message: 23/01/2007, 10h17
  5. Delphi7-DOA accéder au champ d'un enregistrement par indice
    Par delphim dans le forum Bases de données
    Réponses: 1
    Dernier message: 04/05/2005, 14h42

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