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 :

Condition WHERE avec UNION


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Manipulateur en electro-radiologie medicale
    Inscrit en
    Août 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Manipulateur en electro-radiologie medicale
    Secteur : Santé

    Informations forums :
    Inscription : Août 2015
    Messages : 21
    Par défaut Condition WHERE avec UNION
    Bonsoir à tous
    Mon niveau sql n'est pas au top ... Je requiert un peu d'aide.
    J'ai une requête "count*" pour moi complexe qui marche
    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
     
    select DISTINCT A.valeur, sum(nombre) from ( 
    							select `column_1` as valeur,count(*) as nombre from matable as T1 
    							group by `column_1` union 
    							select `column_2`, count(*) from matable 
    							as T2 group by `column_2` 
    							union 
    							select `column_3`,count(*) from matable
    							as T3 group by `column_3`
    							union 
    							select `column_4`,count(*) from matable 
    							as T4 group by `column_4`
    							union 
    							select `column_5`,count(*) from matable 
    							as T5 group by `column_5`)
    							AS A group by A.valeur
                                                            ORDER BY sum(nombre) DESC;
    Je voudrais y rajouter une requête(juste la condition WHERE) simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "SELECT `date` FROM `matable` WHERE YEAR(`date`) = YEAR(CURRENT_DATE);"
    Vous l'avez compris je cherche à avoir le même résultat mais en comptant que pour l'année en cours.

    Merci par avance à vous tous.
    Bon dev.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 185
    Par défaut
    Bonjour,

    Je ne sais pas quelle base de données c'est mais en tout cas la requête n'est pas optimale. Puisqu'il s'agit toujours de la même table un seul count(*) suffit. De plus il faudrait plutôt faire UNION ALL que UNION. Il faut que tu ajoutes la date dans la sous-requête si tu veux pouvoir filtrer par date.

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 143
    Par défaut
    La requête peut être simplifiée :
    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
    select  valeur
        ,   count(*)    as nombre
    from    (   select  column_1    as valeur
                    ,   madate      as madate
                from    matable
            union all
                ...
            union all
                select  column_5
                    ,   madate
                from    matable
            )   as  A 
    where   year(madate) = year(current_date)
    group by valeur
    order by count(*) desc
    ;
    La requête aurait été encore plus simple si la table avait été correctement modélisée
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  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
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    La requête peut être simplifiée :
    Attention, le résultat ne sera pas tout à fait identique s'il existe des valeurs communes entre les différentes colonnes

  5. #5
    Membre averti
    Homme Profil pro
    Manipulateur en electro-radiologie medicale
    Inscrit en
    Août 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Manipulateur en electro-radiologie medicale
    Secteur : Santé

    Informations forums :
    Inscription : Août 2015
    Messages : 21
    Par défaut Plus de précision.
    Bonjour à tous,
    Merci à vous d'avoir répondu si rapidement.
    Je m'excuse auprès de vous deux pour le manque d'information sur ma DB.

    -----------PRÉCISION DB-----------------

    date column_1 column_2 column_3 column_4 column_5
    2020/04/03 32 5 24 45 17
    2020/02/12 5 45 17 32 24
    2019/12/02 45 24 17 32 5

    Voilà chaque numéro à une correspondance (45= pierre, 24=paul ....) , pour une entrée chaque jour il ne peut y avoir le même numéro.
    J'aimerais compter combien de fois chaque numéro est présent sur les 5 colonnes (poste de travail).

    -------------------------------------------

    "vanagreg" La différence entre UNION et UNION ALL, ce n'est pas qu'il prendra toute la db ? Est-ce vraiment utile ? (Je pensais optimiser car cela me donnait le même résultat).

    -------------------------------------------

    "al1_24" Merci je pense avoir compris comment insérer mon "where" j’essaie de suite.

    -------------------------------------------

    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
    20
    21
     
    select  valeur, count(*) as nombre
            from    (select  column_1 as valeur
                                ,madate as madate
                       from matable
                       union all
                       select  column_2, madate
                       from matable
                       union all
                       select  column_3, madate
                       from matable
                       union all
                       select  column_4, madate
                       from matable
                       union all
                       select  column_5, madate
                       from matable)
                       as  A
                       where year(madate) = year(current_date)
                       group by valeur
                       order by count(*) desc;
    Je viens de tester dans phpmyadmin et les résultats semblent correct.
    Je vous remercie encore.

    Si vous voyez une optimisation avec ces nouvelles informations n'hésitez pas.

    (Je ne sais pas si je clic sur , vous pouvez toujours écrire sur le sujet ? )


  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 454
    Par défaut
    Un sujet résolu n'est pas fermé - les sujets ne sont, en général, jamais fermés.

    Vu les ` autour des noms de colonne vous devez utiliser MySQL ou MariaDB.
    Quelle base et quelle version utilisez-vous ?

    Edit : peu importe MySQL ne supporte pas la fonctionnalité UNPIVOT.

    J'aurai fait ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      select `date`
           , valeur
           , count(distinct src) as nb_doublons
        from (
              select `date`, 'col1', col1 from MaTable where year(`date`) = year(current_date) union all
              select `date`, 'col2', col2 from MaTable where year(`date`) = year(current_date) union all
              select `date`, 'col3', col3 from MaTable where year(`date`) = year(current_date) union all
              select `date`, 'col4', col4 from MaTable where year(`date`) = year(current_date) union all
              select `date`, 'col5', col5 from MaTable where year(`date`) = year(current_date)
             ) as t (`date`, src, valeur)
    group by `date`
           , valeur
      having count(distinct src) > 1;

  7. #7
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 185
    Par défaut
    Quelle est la DB? Ce que tu veux faire c'est un UNPIVOT. Dans Oracle je ferai comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select valeur, count(*)
    from matable
    unpivot (valeur for col in (column_1 as 'col1', column_2 as 'col2', column_3 as 'col3', column_4 as 'col4', column_5 as 'col5'))
    where madate between trunc(sysdate, 'y') and add_months(trunc(sysdate, 'y'), 12)-1
    group by valeur;
    J'espère que ta DB a une fonction d'UNPIVOT, parce qu'être obligé de faire des UNION pour ça c'est pas terrible. C'est justement un UNION ALL qu'il faut faire ici car si jamais tu as 2 dates identiques avec le même numéro dans 2 colonnes différentes alors tu les élimineras (le UNION enlève les doublons, contrairement à UNION ALL). Si tu n'as pas 2 fois la même date alors ça ne se verra pas, sauf que UNION fera un tri inutile.

  8. #8
    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
    Par défaut
    Citation Envoyé par bouman Voir le message
    Voilà chaque numéro à une correspondance (45= pierre, 24=paul ....) , pour une entrée chaque jour il ne peut y avoir le même numéro.
    J'aimerais compter combien de fois chaque numéro est présent sur les 5 colonnes (poste de travail).
    Ces numéros représente des identifiant de personnes ? vous avez une table personne qui les référence ?

    Si c'est bien le cas, vous pouvez plus simplement faire ainsi, (puisqu'une personne ne peut être présente plusieurs fois sur la meme ligne si j'ai bien compris )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT Personne.numero
      ,  COUNT(*)
    FROM Personne
    INNER JOIN LaTable AS T ON Personne.Numero IN (T.column_1, T.column_2, T.column_3, T.column_4, T.column_5)
    GROUP BY Personne.numero

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

Discussions similaires

  1. [AC-2010] VBA Conditions WHERE avec LIKE
    Par alineleleu dans le forum VBA Access
    Réponses: 4
    Dernier message: 30/05/2014, 14h36
  2. condition where avec iif et and
    Par sardaucar dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 15/05/2014, 16h22
  3. [AC-2007] Double condition Where avec utilisation de AND dans DoCmd.OpenReport
    Par m1koo dans le forum VBA Access
    Réponses: 2
    Dernier message: 07/03/2012, 08h28
  4. Condition Where avec valeur de la meme table
    Par pelloq1 dans le forum Requêtes
    Réponses: 4
    Dernier message: 27/04/2009, 15h22
  5. Réponses: 2
    Dernier message: 16/06/2007, 12h37

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