|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Membre habitué
![]() Inscription : mars 2002 Messages : 560 ![]() |
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 :
Merci ! |
||
|
|
00
|
|
|
#2 |
|
Membre confirmé
![]() Grégoire MARTINIngénieur développement logiciels Inscription : janvier 2011 Messages : 128 ![]() |
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 .
__________________
Cordialement. |
|
|
00
|
|
|
#3 | ||
|
Membre habitué
![]() Inscription : mars 2002 Messages : 560 ![]() |
OK merci, je vais essayer avec le UNION ALL mais que pensez-vous de cette requête ?
Code :
|
||
|
|
00
|
|
|
#4 | ||
|
Membre confirmé
![]() Développeur informatique Inscription : octobre 2006 Messages : 181 ![]() |
Bonjour,
Ta derniere requete renverra le bon statut salarié , mais aussi le statut non salarié pour ceux qui possedent les deux. Code :
Si chaque actionnaire a au moins un cpte_iden connu , le where devient inutile. |
||
|
|
00
|
|
|
#5 | ||||
|
Membre Expert
![]() Responsable de service informatique Inscription : janvier 2009 Messages : 1 094 ![]() |
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 :
Code SQL :
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. |
||||
|
|
00
|
|
|
#6 | |||
|
Membre confirmé
![]() Grégoire MARTINIngénieur développement logiciels Inscription : janvier 2011 Messages : 128 ![]() |
Citation:
Donne moi les actionnaires qui sont dans le registre des salariés ou des non salariés = tout le monde non ?
__________________
Cordialement. |
|||
|
|
00
|
|
|
#7 |
|
Membre habitué
![]() Inscription : mars 2002 Messages : 560 ![]() |
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. |
|
|
00
|
|
|
#8 |
|
Membre confirmé
![]() Grégoire MARTINIngénieur développement logiciels Inscription : janvier 2011 Messages : 128 ![]() |
Donne nous un jeu de test complet, ce que tu obtiens actuellement et ce que tu voudrais obtenir.
__________________
Cordialement. |
|
|
00
|
|
|
#9 | ||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Je pense à quelque chose comme ça (avec id_salarie la PK de la table):
Code :
|
||
|
|
00
|
|
|
#10 | ||
|
Membre confirmé
![]() Développeur informatique Inscription : octobre 2006 Messages : 181 ![]() |
Code :
Ma premiere requete devrait aussi marcher |
||
|
|
00
|
|
|
#11 | ||
|
Membre habitué
![]() Inscription : mars 2002 Messages : 560 ![]() |
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 :
|
||
|
|
00
|
|
|
#12 | ||
|
Membre habitué
![]() Inscription : mars 2002 Messages : 560 ![]() |
Je travaille sur la requête WHEN EXISTS donc qui me semble plus pertinente.
Bon je donne une exemple donc : l'actionnaire 1 se retrouve sur les rubriques comptables suivantes : La requête : Code :
1 1110 1 1110 1 1410 1 1410 ..... Cet actionnaire N°1 doit être considéré comme "NON SALARIE". Sur l'actionnaire N°2 la requête select s.acti_iden, s.cpte_iden from soaa s where s.emet_iden = 63739 and (s.ACTI_IDEN = 2) 2 1000 2 1000 2 1110 2 1110 2 1176 2 1176 2 1176 ..... Cet actionnaire même s'il est référencé sur un compte non salarié (1110) doit quand même être considéré comme salarié... |
||
|
|
00
|
|
|
#13 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 643 ![]() |
bonjour,
d'où viennent les données de la colonne cpte_iden ? Sont-elles référencées dans une autre table (foreign key) ? |
|
|
00
|
|
|
#14 |
|
Membre habitué
![]() Inscription : mars 2002 Messages : 560 ![]() |
De la table SOAA.
Il n'y a pas de foreign key hélas. Pas à ma connaissance. |
|
|
00
|
|
|
#15 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 643 ![]() |
Mais comment savez-vous que telle rubrique comptable doit du coup définir le type "salarié" ou "non salarié" ?
Un mail, xls, ..... une référence dans une table ? |
|
|
00
|
|
|
#16 | ||
|
Membre habitué
![]() Inscription : mars 2002 Messages : 560 ![]() |
Je me base par rapport à une liste de valeurs communiquée.
Bon j'ai une requête intermédiaire qui ramène : Code :
184 salarié 184 salarié 184 non salarié 184 non salarié 184 salarié 184 salarié 1839 non salarié 1839 non salarié Au final il faut avoir : 184 salarié 1839 non salarié Donc tout actionnaire étant à la fois salarié et non salarié est salarié. Tout actionnaire salarié est salarié. Tou actionnaire non salarié est salarié. Voilà donc il faudrait être capable de mettre en place cette règle de gestion en SQL. |
||
|
|
00
|
|
|
#17 | ||||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 643 ![]() |
Dans ce cas ... c'est moche.
Réalisez une vue à base d'union all pour gérer la liste de vos rubriques. ca vous permettra d'avoir une solution maintenable faicllement ... Code :
Maintenant que vous avez une stucture propre : Code :
edit: ah !! mais je viens de comprendre que vous avez 1 ligne par cpte_iden !! c'est une modélisation qui ne va pas du tout ! |
||||
|
|
00
|
|
|
#18 |
|
Membre habitué
![]() Inscription : mars 2002 Messages : 560 ![]() |
Oui l'idée de la vue est intéressante mais il faut que je vois si je peux avoir les droits pour la créer.
Sinon j'ai une solution temporaire avec 2 sous-requêtes qui prend le max du statut 'salarié'/'non salarié' pour exclure le statut 'non salarié'. Il faut maintenant que j'essaye d'intégrer cette requête dans la requête principale pour voir les performances. En effet, le modèle de données est mal conçu mais il faut tout de même faire avec hélas. |
|
|
00
|
|
|
#19 | ||||||
|
Membre habitué
![]() Inscription : mars 2002 Messages : 560 ![]() |
Bon merci punkoff pour l'idée cela renvoie donc le résultat désiré.
Ci-dessous la requête finale : Code :
Code :
Dans ce cas il faut interroger une autre table. Peut-on penser faire ainsi ? Code :
|
||||||
|
|
00
|
|
|
#20 | ||||
![]() ![]() |
Je ne suis pas rentré dans votre problématique, mais j'aime toujours ce genre de formule :
Code :
a.soaa_date >= add_months(to_date('01/' || to_char(sysdate,'mm/yyyy'),'dd/mm/yyyy'),-1)) Code :
Code :
Est équivalente à : Sauf que cette dernière profitera d'un index sur soaa_date s'il existe, et évite de convertir la première colonne - même si c'est un calcul rapide - c'est toujours un calcul inutile. Évidemment si vous avez un index sur l'expression trunc(b.soaa_date), cette dernière remarque a un peu moins d'intérêt.
__________________
Email : http://scr.im/waldar |
||||
|
00
|
Copyright © 2000-2012 - www.developpez.com