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 :

Problème de comptage sous Oracle 10g


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Par défaut Problème de comptage sous Oracle 10g
    Bonjour,

    J'ai une problématique pour écrire une requête.

    Je donne un exemple.

    J'ai une liste de rubriques comptables suivantes qui identifient un salarié : 1000,1176,...
    J'ai une autre liste de rubriques comptables qui identifient un non salarié :
    1110,1114,....


    Jusque là tout va bien sauf qu'un actionnaire peut être présent dans les deux rubriques.
    Exemple 1 : l'actionnaire 1 est présent dans 1000, 1176 et 1110 --> il doit être identifié comme SALARIE et non comme NON SALARIE.
    Exemple 2 : l'actionnaire 2 est présent dans 1110 et 1114 et doit donc être identifié comme NON SALARIE.
    Exemple 3 : l'actionnaire 3 est présent uniquement dans les rubriques 1000 et 1176, il doit donc être identifié comme SALARIE.

    Ce qui me pose problème c'est le cas de l'exemple 1 quand l'actionnaire est présent dans les deux groupes....

    Car sinon j'aurais fait 2 requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select actionnaire, 'SALARIE' as 'Statut', ...from matable where
    cpte_iden in ('1000','1176',...)
    UNION
    select actionnaire, 'NON SALARIE' as 'Statut', ...from matable where
    cpte_iden in ('1110','1114',...)
    Voilà si vous avez des idées pour traiter le cas 1, je suis preneur.
    Merci !

  2. #2
    Membre très actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    Bonjour,

    Votre requête me semble bonne à part le UNION.

    En effet le UNION dédoublonne alors que UNION ALL serait à mon avis plus adéquat dans votre cas de figure .

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Par défaut
    OK merci, je vais essayer avec le UNION ALL mais que pensez-vous de cette requête ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select actionnaire, 'SALARIE' as 'Statut', ...from matable where
    (cpte_iden in ('1000','1176',...) or cpte_iden in ('1110','1114',...))
    UNION
    select actionnaire, 'NON SALARIE' as 'Statut', ...from matable where
    cpte_iden in ('1110','1114',...)

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Ta derniere requete renverra le bon statut salarié , mais aussi le statut non salarié pour ceux qui possedent les deux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select 
     actionnaire
    ,case when sum (case when cpte_iden in ('1000','1176',les codes de type salarié) 
                                   then 1 
                                   else 0
                           end
                           ) > 0
            then "salarie"
            else "non salarié"
    from matable
    where cpte_iden in ( tous les codes type statut)
    group by actionnaire
    devrait renvoyer ce que tu cherches.
    Si chaque actionnaire a au moins un cpte_iden connu , le where devient inutile.

  5. #5
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 449
    Par défaut
    Bonjour,
    Le UNION ne dédoublonnera rien ici, car la valeur d'une des colonnes du résultat change d'une requête à l'autre.
    Est-ce que tu peux nous donnée le schéma de tes tables, ainsi qu'un jeu de test ?

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select actionnaire, 'SALARIE' as 'Statut', ...from matable where
    (cpte_iden in ('1000','1176',...) or cpte_iden in ('1110','1114',...))
    UNION
    select actionnaire, 'NON SALARIE' as 'Statut', ...from matable where
    cpte_iden in ('1110','1114',...)
    est équivalent à :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select actionnaire, 'SALARIE' as 'Statut', ...from matable where
    (cpte_iden in ('1000','1176','1110','1114',...))
    UNION
    select actionnaire, 'NON SALARIE' as 'Statut', ...from matable where
    cpte_iden in ('1110','1114',...)

    D'après ta demande:
    les non salariés sont ceux présent dans la liste des non salariés, et absents de l'autre liste.
    les salariés sont ceux présent dans la première liste

    Est-ce que j'ai bon ?

    Tatayo.

  6. #6
    Membre très actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    Citation Envoyé par david71 Voir le message
    OK merci, je vais essayer avec le UNION ALL mais que pensez-vous de cette requête ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select actionnaire, 'SALARIE' as 'Statut', ...from matable where
    (cpte_iden in ('1000','1176',...) or cpte_iden in ('1110','1114',...))
    UNION
    select actionnaire, 'NON SALARIE' as 'Statut', ...from matable where
    cpte_iden in ('1110','1114',...)
    Et bien la premiere partie de la requete va identifier tout le monde comme étant salarié :

    Donne moi les actionnaires qui sont dans le registre des salariés ou des non salariés = tout le monde non ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Par défaut
    Ca ne marche pas, cela ramène 4 lignes comme ça.
    Il faut peut-être que j'enlève le OR dans la première requête, j'essaie de nouveau.

    Je parle de ma requête en tout cas.
    Attendez, merci pour votre aide je vais regarder vos requêtes pour voir ce que cela donne.

  8. #8
    Membre très actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    Citation Envoyé par david71 Voir le message
    Ca ne marche pas, cela ramène 4 lignes comme ça.
    Il faut peut-être que j'enlève le OR dans la première requête, j'essaie de nouveau.

    Je parle de ma requête en tout cas.
    Attendez, merci pour votre aide je vais regarder vos requêtes pour voir ce que cela donne.
    Donne nous un jeu de test complet, ce que tu obtiens actuellement et ce que tu voudrais obtenir.

  9. #9
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Je pense à quelque chose comme ça (avec id_salarie la PK de la table):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    with salarie as (
    select id_salarie
      from matable 
     where cpte_iden in ('1000','1176',...)
     group by id_salarie
    having count(*) = /*nombre de valeur dans le IN*/
    )
    select actionnaire, 'salarie' as statut, ...
      from matable
     where id_salarie in (select id_salarie from salarie)
     UNION ALL
    select actionnaire, 'NON SALARIE' as Statut, ...
      from matable 
     where cpte_iden not in (select id_salarie from salarie)
    Si la liste des salariés n'est pas écrite en dur regarde La division relationnelle pour générer la CTE (le WITH).

  10. #10
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Billets dans le blog
    1
    Par défaut avec sous requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select distinct
     actionnaire
    ,case when exists (select 1 from matable T2 
                                           where T2.actionnaire = maTable.actionnaire
                                           and    T2.cpte_iden IN (codes salarié)
                              )
              then 'salarié'
              else ' non salarié'
     end
    from matable
    where cpte_iden in ( les codes statuts possibles )
    ou le where peut a nouveau etre facultatif.
    Ma premiere requete devrait aussi marcher

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Par défaut
    Bon merci pour vos idées.
    J'ai essayé de reprendre la première requête de Jean.cri1 qui semblait convenir (avec le SUM et le CASE WHEN, d'ailleurs il manquait un END je pense) mais ça ne marche pas, problème de GROUP BY :

    Ci-dessous la requête complète donc :


    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    select distinct 'SOCIETE', e.emet_iden ||'-'|| a.acti_iden||'-'||t.titu_nume, '',
    'I', 
    t.titu_nom||','||t.titu_pren,
    '',
    '',
    t.adre_info_rue, 
    t.adre_nom_comu,
    p1.pays_libe,
    p2.pays_libe,
    '',
    t.titu_date_nais, 
    p3.pays_libe || ' - ' || t.titu_comu_nais,
    '', 
    e.emet_iden,
    '',
    e.emet_libe,
    '', 
    'Tiers',
    '', 
    case when sum(case when a.cpte_iden IN ('1000','1001','1002','1003','1004','1005','1006','1007','1008','1009','1142','1143','1144','1146','1160',
    '1161','1163','1165','1166','1168','1176','1177','1196','1197','1199','1499','1510','1520','1535','1540','1544','1549','1565','1576',
    '1577','1589','1599','1504','1147','1167','1186','1598','1514','1516','1533') 
                                   then 1 
                                   else 0
                           end
                           ) > 0
            then 'salarie'
            else 'non salarié'
    end, 
    '',
    '',
    case t.titu_qual
    when 'MME' then 'F'
    when 'MLLE' then 'F'
    when 'MR' then 'M'
    when 'MR OU MME' then 'M'
    when 'MR ET MME' then 'M'
    when 'AUTRE' then ''
    when 'CORRESP' then ''
    when 'SOCIETE' then ''
    end,
    case t.titu_resi_fisc 
    when 'FRANCE' THEN 'R'
    else 'N'
    end
    from soaa a,emet e,titu t,vale v, pays p1, pays p2, pays p3
    where a.soaa_date=(select max(soaa_date) from soaa b where
    b.ADMI_IDEN=a.ADMI_IDEN and
    b.CREF_IDEN=a.CREF_IDEN and
    b.VALE_IDEN=a.VALE_IDEN and
    b.CPTE_IDEN=a.CPTE_IDEN and
    b.TYCP_IDEN=a.TYCP_IDEN and
    b.EMET_IDEN=a.EMET_IDEN and
    b.ACTI_IDEN=a.ACTI_IDEN and
    -- pour tester sur deux actionnaires différents (184 est salarié) et 1839 non
    e.emet_iden = 63739 and
    (a.ACTI_IDEN = 184 or a.ACTI_IDEN = 1839) and 
    --
    b.SOAA_SENS=a.SOAA_SENS and trunc(b.soaa_date)<=trunc(sysdate))
    and a.cref_iden=1
    -- on prend tous les comptes
    and a.cpte_iden IN ('1000','1001','1002','1003','1004','1005','1006','1007','1008','1009','1142','1143','1144','1146','1160',
    '1161','1163','1165','1166','1168','1176','1177','1196','1197','1199','1499','1510','1520','1535','1540','1544','1549','1565','1576',
    '1577','1589','1599','1504','1147','1167','1186','1598','1514','1516','1533','1101','1103','1104','1110','1113','1114','1115','1116',
    '1117','1118','1119','1120','1125','1126','1130','1133','1135','1136',
    '1140','1141','1145','1149','1150','1154','1155','1156','1170','1171','1172','1173','1174','1175','1179','1185','1310','1311','1312','1500','1600')
    and (a.soaa_quan <> 0 or ( a.soaa_quan=0 and 
    		           a.soaa_date >= add_months(to_date('01/' || to_char(sysdate,'mm/yyyy'),'dd/mm/yyyy'),-1)))
    and e.emet_iden=a.emet_iden
    and e.emet_indi_actf='O'
    and t.emet_iden=a.emet_iden
    and t.acti_iden=a.acti_iden
    and v.vale_iden=a.vale_iden
    and v.vale_indi_actf='O'
    and t.titu_natu_juri = 'PP'
    and t.adre_pays_iden  = p1.pays_iden (+)
    and t.adre_fisc_pays_iden  = p2.pays_iden (+)
    and t.pays_nais_iden  = p3.pays_iden (+);

Discussions similaires

  1. Problème depuis ma migration sous Oracle 10g
    Par th.garcia dans le forum SQL
    Réponses: 0
    Dernier message: 01/07/2009, 15h51
  2. Problème avec le type "LONG" sous Oracle 10g
    Par th.garcia dans le forum Oracle
    Réponses: 3
    Dernier message: 19/06/2009, 12h57
  3. Probléme d'installation d'oracle 10g.r2.64 sous unix RHEL5.64
    Par issamo1515 dans le forum Installation
    Réponses: 2
    Dernier message: 13/05/2008, 13h48
  4. Envoyer un mail en cas de problème sous Oracle 10g
    Par frGya dans le forum Débuter
    Réponses: 3
    Dernier message: 26/02/2008, 15h37
  5. problème d'exécution d'un report sous oracle 10g
    Par seure dans le forum Reports
    Réponses: 1
    Dernier message: 22/03/2006, 17h47

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