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 :

Grouper pour plusieurs champs et compter


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Grouper pour plusieurs champs et compter
    Bonjour,
    J'espère réussir à être la plus claire possible.
    J'ai un premier champ technicien avec des codes et aussi des 0. Je souhaite compter le nombre de lignes que j'ai pour chaque technicien à partir de mon champ ref.
    J'ai un deuxième champ ordon avec que des codes. Je souhaite compter le nombre de lignes que j'ai pour chaque ordon à partir aussi de mon champ ref.
    Ces deux champs représentent donc des codes renvoyant à des personnes. Même si j'ai des 0 dans mon champ technicien, j'aurai automatiquement un code dans mon champ ordo. Avec ou sans 0, je dois compter le nombre de lignes que j'ai dans mes deux champs, pour chaque personne.
    J'ai un troisième champ niv que je voulais compter également (Remarque à la fin)
    J'ai donc voulu faire un group by avec mon champ technicien, et ensuite mon champ ordon, mais j'obtiens des résultats bidons complet.
    Voici la requête que j'avais effectuée :
    Ici, j'ai donc affiché comme j'aurais aimé avoir cad mon champ technicien, mon comptage de ref pour mon champ technicien, mon comptage de niv ayant G pour technicien, mon champ ordon, mon comptage de ref pour mon champ ordon, mon comptage de niv ayant G pour ordon.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select technicien, count(ref),count(niv), ordon, count(ref),count(niv)
    from table
    where date between '20200901' and '20201001' and niv = 'G' and rownum < 50000
    group by technicien, ordon ;

    Remarque : quand je compte niv, si je le mets dans where, il va croire que je ne veux sélectionner les ref qu'ayant niv='G', je veux juste les compter, sans que cela me changer le nombre de ref pour mes autres champs.
    si vous pouviez m'aider, merci à vous

  2. #2
    Modérateur

    Essayez de mettre quelques données représentatives - une dizaine de lignes avec seulement les colonnes nécessaires - pour illustrer votre requête.
    Et essayez ceci, sans garantie :
    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 'technicien' as src
           , technicien
           , count(ref)
           , count(case niv when 'G' then 1 end) as cnt_niv_G
        from MaTable
       where to_date(MaDate, 'yyyymmdd') >= date '2020-09-01'
         and to_date(MaDate, 'yyyymmdd') <  date '2020-10-01'
    group by technicien
       union all
      select 'ordon' as src
           , ordon
           , count(ref)
           , count(case niv when 'G' then 1 end)
        from MaTable
       where to_date(MaDate, 'yyyymmdd') >= date '2020-09-01'
         and to_date(MaDate, 'yyyymmdd') <  date '2020-10-01'
    group by ordon;

    Et précisez votre SGBD, j'ai supposé Oracle Database à cause du rownum.

  3. #3
    Membre éclairé
    Bonjour,

    En fait ce n'est pas clair. Pourrais-tu montrer quelques lignes représentatives en entrée et ce que tu souhaites en sortie?
    De plus, n'utilises pas de chaines de caractères pour comparer des dates.
    Merci

  4. #4
    Membre du Club
    Bonjour,
    merci pour vos réponses, alors votre requête fonctionne mais ce n'est pas le résultat que je recherche.
    Je vais expliquer avec un extrait de lignes ci-joint :
    donc ce que je voulais en premier c'est tous mes codes techniciens et compter pour chacun le nombre de ref + les niv G et pour les codes ordon compter pour chacun le nombre de ref+les niv G.

    Dans mon exemple :
    on va regrouper le code 3015 du technicien, on va compter le nombre de ref (on s'aperçoit bien sûr que par rapport à l'ordon on a différents codes pour un même technicien, c'est normal, car en fait le technicien fait un premier travail, et ordon va faire le second travail, pour une même ref), ici j'ai donc pour 3015 7 lignes pour ma ref et 1 ligne pour niv G.
    maintenant si je regroupe le code 3015 ordon, j'ai 2 lignes pour ref, et 0 pour niv G.
    dans ces deux champs, j'ai un même code, mais il ne s'agit pas de la même activité, le technicien commence le début d'un travail, ordon fera la suite.
    pour technicien je peux avoir 0, ce qui veut dire que la tâche a été automatisée mais j'aurai toujours un code ordon, car la suite ne peut pas être automatisée. donc tous mes 0 seront regroupés pour code technicien, mais mes codes ordon seront dans tous les cas comptés pareil.
    Toujours dans mon exemple comme code technicien 0, je vais avoir 2 lignes références, et 0 ligne pour niv G. En revanche j'aurai pour ordon 571, 1 ligne référence, et 0 ligne pour niv G (comme j'aimerais un regroupement des codes ordon, il est fort probable que cette personne ait travaillée après un code 0 technicien, et des codes techniciens de personne physique).

    Concernant la date, elle est comme ceci dans la table et ce n'est pas la mienne, je ne peux pas la modifier.
    merci à vous tous

  5. #5
    Expert éminent sénior
    Bonjour,

    Désolé mais je n'y comprends rien

    Citation Envoyé par Statistiques33 Voir le message
    ici j'ai donc pour 3015 7 lignes pour ma ref et 1 ligne pour niv G.

    je vois 6 lignes ref pour le technicien 3015...



    Citation Envoyé par Statistiques33 Voir le message
    maintenant si je regroupe le code 3015 ordon, j'ai 2 lignes pour ref, et 0 pour niv G.

    que signifie "je regroupe le code 3015 ordon" ?
    Si on groupe sur le code technicien seul, alors il n'y aura bien sûr qu'une seule ligne pour la valeur "3015"
    Si on groupe sur le code technicien+le code ordon, alors il y a 3 lignes puisque 3 valeurs distinctes de ordon (2845, 3389 et 99999)



    Citation Envoyé par Statistiques33 Voir le message
    Toujours dans mon exemple comme code technicien 0, je vais avoir 2 lignes références, et 0 ligne pour niv G.

    Ben non : on voit bien deux lignes références (les deux dernières), mais toutes deux avec niv="G"


    Bref c'est hyper confus !

  6. #6
    Membre éclairé
    Bonjour,

    Merci pour le jeu de données exemple, mais qu'est-ce qui ne va pas avec la requête proposée par Waldar, elle semble répondre à ce que tu souhaites?
    Sinon, par rapport à ton jeu de données exemple, quel est le résultat que tu attends ? (Tu peux donner le même genre de fichier Excel pour le résultat)
    Merci

  7. #7
    Membre du Club
    Citation Envoyé par escartefigue Voir le message
    Bonjour,

    Désolé mais je n'y comprends rien


    je vois 6 lignes ref pour le technicien 3015...
    effectivement j'avais compté le filtre, c'est 6 lignes

    Citation Envoyé par escartefigue Voir le message

    que signifie "je regroupe le code 3015 ordon" ?
    Si on groupe sur le code technicien seul, alors il n'y aura bien sûr qu'une seule ligne pour la valeur "3015"
    Si on groupe sur le code technicien+le code ordon, alors il y a 3 lignes puisque 3 valeurs distinctes de ordon (2845, 3389 et 99999)
    j'ai plusieurs lignes avec ce même code ordon, puisque j'ai dit que j'avais plusieurs lignes ref avec le même code ordon (ou même code technicien).
    mon but est de compter le nombre de ref, et de compter le nombre de niv avec G.
    non, j'ai dit que ce sont deux activités distinctes


    Citation Envoyé par escartefigue Voir le message
    Ben non : on voit bien deux lignes références (les deux dernières), mais toutes deux avec niv="G"


    Bref c'est hyper confus !
    oui je compte pour technicien =0 , 2 lignes pour ref, et 2 lignes pour niv=G.
    ok, je fais ce que je peux pour expliquer.

  8. #8
    Membre du Club
    Citation Envoyé par vanagreg Voir le message
    Bonjour,

    Merci pour le jeu de données exemple, mais qu'est-ce qui ne va pas avec la requête proposée par Waldar, elle semble répondre à ce que tu souhaites?
    Sinon, par rapport à ton jeu de données exemple, quel est le résultat que tu attends ? (Tu peux donner le même genre de fichier Excel pour le résultat)
    Merci
    Bonjour,
    alors c'est bon en fait, c'est parce que cela me prenait des résultats aléatoires à cause du 50000 lignes, du coup maintenant j'aimerais savoir comment faire pour avoir les résultats pour chaque jour dans ce même mois sélectionné
    merci

  9. #9
    Membre éclairé
    Tu ajoutes ta colonne date dans ton SELECT et dans ton GROUP BY.

###raw>template_hook.ano_emploi###