Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/11/2004, 07h13   #1
Invité régulier
 
Inscription : juillet 2002
Messages : 33
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 33
Points : 6
Points : 6
Par défaut Jointure compliqué

je programme en delphi et Interbase
j'ai besoin de conseil et d'une requete sql
exple

table1 ( 50000 ligne enreg)
___________________________________
CODE ARTICLE CUMUL DISPO
__________________________________
TY1 AAAA 10 2
DR8 AABB 20 5
GH3 VVCC 25 10
SQ7 DDEE 25 10
HH8 EEAA 40 38
__________________________________


TABLE 2 ( 50000 a 20000 lignes enreg)
__________________________________
CODE ARTICLE CONSOM
__________________________________
TY1 AAAA 8
DR8 AABB 10
GH3 VVCC 5
SQ7 DDEE 15
SQ7 DDEE -4
__________________________________


TABLE 3 ( 50000 a 20000 lignes enreg)
__________________________________
CODE ARTICLE CONSOM
__________________________________
HH8 EEAA 2
DR8 AABB 10
GH3 VVCC 5
GH3 VVCC -5
__________________________________

je cherche à réaliser une sortie comme ceci
es ce que je dois créer une table vue
avec un jointure ou une 4eme table phisique
remarque j'ai n'ai pas eu idée comment
construire une jointure de la sorte



table 4
_________________________________________________________
CODE ARTICLE CUMUL DISPO CONSOM ecart
_________________________________________________________
TY1 AAAA 10 2 8 0 normal
DR8 AABB 20 5 20 +5 anormal
GH3 VVCC 25 10 5 5 normal
SQ7 DDEE 25 10 11 -4 anormal
HH8 EEAA 40 40 0 0 normal
_________________________________________________________


merci à tous
Ada_b
ada_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2004, 11h21   #2
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Vous avez beaucoup de redondance d'information, ce qui est un peu incompatible avec la normalisation des données et l'utilisation d'un SGBD. Ou le principe général justement d'éviter la duplication d'une même information (sauf probleme technique).

Table 2 et table 3 sont identiques pourquoi n'avoir pas qu'une seule table ?

Mis à part cette remarque, pour ce qui est de votre probleme
la solution dépend de votre SGBD

Si vous utilisez Interbase 6 ou inf il vous faudra passer par une PS ou avoir un résultat un peu différent et le traiter par le client.

Code :
1
2
3
4
5
SELECT T1.CODE_ART, T1.CUMUL, T1.DISPO, sum(T2.conso) CONSO_TABLE2 ,sum(T3.conso) COMSO_TABLE3
FROM TABLE1 T1
LEFT JOIN table2 T2 ON (T2.code_art=T1.code_art)
LEFT JOIN table3 T3 ON (T3.code_art=T1.code_art)
GROUP BY T1.CODE_ART, T1.CUMUL, T1.DISPO
En effet on ne peut pas faire directement sum(T2.conso) + sum(T3.conso) car il suffit qu'un des deux sum soit à null pour que l'ensemble soit null.

Par contre si vous travaillez avec Firebird 1.5 (ou peut etre interbase 7.1 ? je n'ai pas vérifié si la fonction existe)

Vous pouvez utiliser la fonction SQL COALESCE.

Code :
1
2
3
4
5
6
7
SELECT T1.CODE_ART, T1.CUMUL, T1.DISPO, 
  sum(coalesce(T2.conso,0)) + sum(Coalesce(T3.conso,0)) COMSO,
  T1.DISPO- (T1.CUMUL - (sum(coalesce(T2.conso,0)) + sum(Coalesce(T3.conso,0)))) ECART
FROM TABLE1 T1
LEFT JOIN table2 T2 ON (T2.code_art=T1.code_art)
LEFT JOIN table3 T3 ON (T3.code_art=T1.code_art)
GROUP BY T1.CODE_ART, T1.CUMUL, T1.DISPO
Et pour le fun on peux même gérer le libellé normal/anormal en SQL :
Code :
1
2
3
4
5
6
7
8
9
SELECT T1.CODE_ART, T1.CUMUL, T1.DISPO, sum(coalesce(T2.conso,0)) + sum(Coalesce(T3.conso,0)) COMSO, T1.DISPO- (T1.CUMUL - (sum(coalesce(T2.conso,0)) + sum(Coalesce(T3.conso,0)))) ECART,
case T1.DISPO- (T1.CUMUL - (sum(coalesce(T2.conso,0)) + sum(Coalesce(T3.conso,0))))
  when 0 then 'Normal'
  else 'Anormal'
end Libelle_Ecart
FROM TABLE1 T1
LEFT JOIN table2 T2 ON (T2.code_art=T1.code_art)
LEFT JOIN table3 T3 ON (T3.code_art=T1.code_art)
GROUP BY T1.CODE_ART, T1.CUMUL, T1.DISPO
Bonne continuation.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2004, 09h02   #3
Invité régulier
 
Inscription : juillet 2002
Messages : 33
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 33
Points : 6
Points : 6
Par défaut mm sujet

Merci Barbibulle

Barbibulle à écrit:
Vous avez beaucoup de redondance d'information
=======================================

réponse

c'est très normal un article peut sortir(apparaitre) sur
plusieur lignes et sur les 2 tables , jusq'au épuisement
__________________________________________

Barbibulle à écrit:
Table 2 et table 3 sont identiques pourquoi n'avoir pas qu'une seule table ?
============================================
réponse

pas possible , les comptes de l'entreprise se retrouve très bien
avec 2 tables une pour le Local et une autre pour les autres régions
____________________________________________

Je travail pour le moment avec Interbase , mais on ne sais jamais
je peux changer suivant le demande ou les contradictions
moralité je veux garder toujours une programmation standard

Merci encore pour les req de jointure sql
Salut à Bientôt
ada_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2004, 10h20   #4
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Par défaut Re: mm sujet

Citation:
Envoyé par ada_b
Barbibulle à écrit:
Table 2 et table 3 sont identiques pourquoi n'avoir pas qu'une seule table ?
============================================
réponse

pas possible , les comptes de l'entreprise se retrouve très bien
avec 2 tables une pour le Local et une autre pour les autres régions
Oui et bien pourquoi ne pas utiliser quand même une seule table ?
En modélisation merise c'est le résultat que vous aurriez du optenir.

Code :
1
2
3
4
TABLE 2:
  Code_article
  Consom
  Region
Ainsi tous vos mouvements de stoque se trouvent dans la même table.

Code :
1
2
3
4
5
6
7
8
9
10
Code_art Consom Region
TY1 AAAA      8 LOCAL
DR8 AABB     10 LOCAL
GH3 VVCC      5 LOCAL
SQ7 DDEE     15 LOCAL
SQ7 DDEE     -4 LOCAL
HH8 EEAA      2 Region1
DR8 AABB     10 Region2
GH3 VVCC      5 Region1
GH3 VVCC     -5 Region3
vos requetes et programmes n'en serait que plus simple et performants.
De plus l'ajout de la gestion d'une autre région serait simple alors que dans votre solution vous seriez probablement obligé de créer une nouvelle table.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2004, 07h19   #5
Invité régulier
 
Inscription : juillet 2002
Messages : 33
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 33
Points : 6
Points : 6
Par défaut mm sujet

Merci bien barbibulle
d'abord exusez moi pour le retard
c'est difficile pour moi pour de resté plus de 10 mn connecté

réponse :
oui c'est vrai j'ai déja proposer ça
mais il ya des choses ;qui ne dependent pas de moi
et je ne peux pas dire plus que ça ,ça serait violé le secret prof


je vais stucturé une table auxiliaire
à partir du client pour ne pas pénaliser le serveur
je vais pomper les infos des 3 tables et les mettres dans celle-ci
j'espère que ça marchera .


merci comme meme pour vos conseils , il me seront bien utiles
pour l'application de comptabilité que je vais commencer
à partir janvier 05

merci bien

Ada_B
ada_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2004, 10h14   #6
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Par défaut Re: mm sujet

Citation:
Envoyé par ada_b
je vais stucturé une table auxiliaire
à partir du client pour ne pas pénaliser le serveur
je vais pomper les infos des 3 tables et les mettres dans celle-ci
j'espère que ça marchera .
Ca risque d'être encore moins performant que la requete a trois jointures car chaque client devra rapatrier ces trois tables.

Essayer plutot de créer une vue basé sur cette requete ca devrait être un peu plus performant que de l'exécuter depuis un client.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2004, 07h12   #7
Invité régulier
 
Inscription : juillet 2002
Messages : 33
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 33
Points : 6
Points : 6
Par défaut mm sujet

créer une vue basé sur cette requete

merci je crois que c'est sa la solution
ada_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2004, 07h13   #8
Invité régulier
 
Inscription : juillet 2002
Messages : 33
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 33
Points : 6
Points : 6
Par défaut mm

merci je crois que c'est ça la solution
ada_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h52.


 
 
 
 
Partenaires

Hébergement Web