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

SQL Oracle Discussion :

Compter et retourner la valeur majoritaire de plusieurs lignes


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2018
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Compter et retourner la valeur majoritaire de plusieurs lignes
    Bonjour,
    Je suis coincé dans une requête pour compter le nb de fois une valeur et retourner cette valeur afin de voir si elle est conforme à une partie d'une autre colonne.

    Je m'explique par rapport à l'image jointe.

    J'ai la colonne "Mr Name" = TS01JD-0001 et j'ai la colonne "Tag Number", je veux compter le nb de "Tag Number" commençant par les 2 premiers caractères "38" ou "41" donc ici 38 = 4x et 41 = 1x.

    Ensuite, je souhaiterai donc que cette valeur majoritaire (ici "38") soit comparer aux 2 premiers caractères de la colonne "Unit Name" et si c'est différent de mettre une valeur "error" dans une colonne.

    Je n'arrive pas à faire ce comptage majoritaire.


    Merci de votre aide.
    Images attachées Images attachées  

  2. #2
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,

    J'ai fait un petit test, en espérant avoir compris correctement le besoin:
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    CREATE TABLE TST181207
    (
      UNIT_NAME   VARCHAR2(50 CHAR),
      TAG_NUMBER  VARCHAR2(20 CHAR),
      MR_NAME     VARCHAR2(15 CHAR)
    );
     
    Insert into TST181207
       (UNIT_NAME, TAG_NUMBER, MR_NAME)
     Values
       ('38 ABC1', '38XY 00602', 'TS01JD-0001');
    Insert into TST181207
       (UNIT_NAME, TAG_NUMBER, MR_NAME)
     Values
       ('38 ABC2', '38XY 01000', 'TS01JD-0001');
    Insert into TST181207
       (UNIT_NAME, TAG_NUMBER, MR_NAME)
     Values
       ('38 ABC3', '38XY 01403', 'TS01JD-0001');
    Insert into TST181207
       (UNIT_NAME, TAG_NUMBER, MR_NAME)
     Values
       ('38 ABC4', '38XY 01406', 'TS01JD-0001');
    Insert into TST181207
       (UNIT_NAME, TAG_NUMBER, MR_NAME)
     Values
       ('42 DEF1', '42XY 03850', 'TS01JD-0001');
    Insert into TST181207
       (UNIT_NAME, TAG_NUMBER, MR_NAME)
     Values
       ('38 ABC5', '41XY 03850', 'TS01JD-0001');
    Insert into TST181207
       (UNIT_NAME, TAG_NUMBER, MR_NAME)
     Values
       ('42 DEF2', '42XY 03850', 'TS01JD-0001');
    Insert into TST181207
       (UNIT_NAME, TAG_NUMBER, MR_NAME)
     Values
       ('42 DEF3', '42XY 03850', 'TS01JD-0001');
    COMMIT;
     
    ----------
     
    WITH basedata
            AS (SELECT a.*
                     , SUBSTR (a.unit_name, 1, 2) unit_name_id
                     , SUBSTR (a.tag_number, 1, 2) tag_number_id
                     , COUNT (SUBSTR (a.tag_number, 1, 2)) OVER (PARTITION BY a.mr_name, SUBSTR (a.unit_name, 1, 2)) ct_tag_number_id
                  FROM TST181207 a)
    SELECT a.*, CASE WHEN a.unit_name_id = a.tag_number_id THEN 'bien!' ELSE 'pas bien!' END check_if_error
      FROM basedata a
         , (  SELECT unit_name_id
                FROM basedata
               WHERE ct_tag_number_id = (SELECT MAX (ct_tag_number_id) FROM basedata)
            GROUP BY unit_name_id) b
     WHERE a.unit_name_id = b.unit_name_id;
    Doit surement y avoir un truc plus court, mais je trouve pas pour le moment (et faut que je retourne au taf ...)

    @+
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Sans requête de fenêtrage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH Tab AS (SELECT '38 PEG' unit_name, 'TS01JD-0001' Mr_Name, '38 XY'|| DBMS_RANDOM.STRING('u', 5) tag FROM dual
    UNION ALL SELECT '38 PEG' unit_name, 'TS01JD-0001' Mr_Name, '38 XY'|| DBMS_RANDOM.STRING('u', 5) tag FROM dual
    UNION ALL SELECT '38 PEG' unit_name, 'TS01JD-0001' Mr_Name, '38 XY'|| DBMS_RANDOM.STRING('u', 5) tag FROM dual
    UNION ALL SELECT '38 PEG' unit_name, 'TS391JD-0001' Mr_Name, '39 XY'|| DBMS_RANDOM.STRING('u', 5) tag FROM dual
    UNION ALL SELECT '38 PEG' unit_name, 'TS01JD-0001' Mr_Name, '41 XY'|| DBMS_RANDOM.STRING('u', 5) tag FROM dual
    UNION ALL SELECT '38 PEG' unit_name, 'TS01JD-0001' Mr_Name, '42 XY'|| DBMS_RANDOM.STRING('u', 5) tag FROM dual
    UNION ALL SELECT '43 PEG' unit_name, 'XXX' Mr_Name, '43 XY'|| DBMS_RANDOM.STRING('u', 5) tag FROM dual
    )
    SELECT unit_name, mr_name, tag, 
      CASE WHEN (SELECT COUNT(*) FROM Tab b WHERE b.mr_name = a.mr_name AND SUBSTR(tag, 1, 2) = SUBSTR(a.unit_name, 1, 2))
                        < (SELECT NVL(MAX(COUNT(*)),0) FROM Tab b WHERE b.mr_name = a.mr_name AND SUBSTR(tag, 1, 2) <> SUBSTR(a.unit_name, 1, 2) GROUP BY SUBSTR(tag, 1, 2))
        		THEN 'Error' END err
    FROM Tab a
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Salut,

    @McM: je me permets une question -> dans ce cas, pourquoi les lignes surlignées en vert ci-dessous:
    Nom : q_sql_181207.png
Affichages : 206
Taille : 8,5 Ko
    ne montrent pas "Error"?

    Elles ont pour mr_name "TS01JD-0001", unit_name "38 PEG" mais contiennent "41" dans leur tag. J'ai raté un truc dans ce qui est demandé?

    @+
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Bein c'est toi qui l'a demandé :
    Ensuite, je souhaiterai donc que cette valeur majoritaire (ici "38") soit comparée aux 2 premiers caractères de la colonne "Unit Name" et si c'est différent de mettre une valeur "error" dans une colonne
    Fais un order by mr_name : Les 2 lignes en vert sont au même niveau que les 3 premières lignes : La valeur majoritaire est 38 (donc vu que unit_name commence par 38 pas d'erreur)

    J'ai mis les colonnes nb_tagUnit et nb_tagdiff pour que tu vois un peu mieux
    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
    WITH Tab AS (SELECT '38 PEG' unit_name, 'TS01JD-0001' Mr_Name, '38 XY'|| DBMS_RANDOM.STRING('u', 5) tag FROM dual
    UNION ALL SELECT '38 PEG' unit_name, 'TS01JD-0001' Mr_Name, '38 XY'|| DBMS_RANDOM.STRING('u', 5) tag FROM dual
    UNION ALL SELECT '38 PEG' unit_name, 'TS01JD-0001' Mr_Name, '38 XY'|| DBMS_RANDOM.STRING('u', 5) tag FROM dual
    UNION ALL SELECT '38 PEG' unit_name, 'TS391JD-0001' Mr_Name, '39 XY'|| DBMS_RANDOM.STRING('u', 5) tag FROM dual
    UNION ALL SELECT '38 PEG' unit_name, 'TS01JD-0001' Mr_Name, '41 XY'|| DBMS_RANDOM.STRING('u', 5) tag FROM dual
    UNION ALL SELECT '38 PEG' unit_name, 'TS01JD-0001' Mr_Name, '42 XY'|| DBMS_RANDOM.STRING('u', 5) tag FROM dual
    UNION ALL SELECT '43 PEG' unit_name, 'XXX' Mr_Name, '43 XY'|| DBMS_RANDOM.STRING('u', 5) tag FROM dual
    )
    SELECT unit_name, mr_name, tag, 
    (SELECT COUNT(*) FROM Tab b WHERE b.mr_name = a.mr_name AND SUBSTR(tag, 1, 2) = SUBSTR(a.unit_name, 1, 2)) nb_tagUnit,
    (SELECT NVL(MAX(COUNT(*)),0) FROM Tab b WHERE b.mr_name = a.mr_name AND SUBSTR(tag, 1, 2) <> SUBSTR(a.unit_name, 1, 2) GROUP BY SUBSTR(tag, 1, 2)) nb_tagdiff,
      CASE WHEN (SELECT COUNT(*) FROM Tab b WHERE b.mr_name = a.mr_name AND SUBSTR(tag, 1, 2) = SUBSTR(a.unit_name, 1, 2))
                        < (SELECT NVL(MAX(COUNT(*)),0) FROM Tab b WHERE b.mr_name = a.mr_name AND SUBSTR(tag, 1, 2) <> SUBSTR(a.unit_name, 1, 2) GROUP BY SUBSTR(tag, 1, 2))
        		THEN 'Error' END err
    FROM Tab a
    ORDER BY mr_name, unit_name, tag
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

Discussions similaires

  1. Valeur maximale parmi plusieurs lignes
    Par bertrantitude dans le forum Débuter
    Réponses: 2
    Dernier message: 26/03/2017, 18h38
  2. Réponses: 6
    Dernier message: 11/04/2013, 16h17
  3. Réponses: 8
    Dernier message: 13/01/2010, 06h42
  4. Réponses: 3
    Dernier message: 08/04/2009, 12h10
  5. Reporter valeur enregistrement sur plusieurs lignes suivantes
    Par oarnold dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 06/03/2008, 17h52

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