ACCESS / SQL

ACCESS / SQL - SQL/NoSQL - Programmation

Marsh Posté le 09-06-2005 à 16:04:41    

Bonjour,
 
J'ai 2 tables une avec des lignes de commande et une autre avec des
lignes de livraison j'aimerai bien fusionner les 2 en une seule. Le
problème c'est que je dois recopier « intelligemment » les données, si
j'ai 30 lignes de commande et 25 lignes de livraison(liées par le meme N° de commande) il faut que dans ma table finale j'ai 5 enregistrements avec le champ livraison incomplet.
 
Ca donne a peu pres ça :
 
Commande
----------------
ID   DATE   N° commande
1   12/05/03   4
2   12/05/03   4
3   12/05/03   4
4   15/09/04  12
5   12/10/04   13
 
Livraison
-------------
ID   DATE   N° commande
1    18/06/03   4
2    19/11/04  13
3    20/06/05   4
4 …..
 
j'aimerai bien avoir :
 
ID   DATE COMMANDE   DATE LIVRAISON    N° commande
1     12/05/03        18/06/03                    4
2     12/05/03        20/06/05                    4
3     12/05/03                                    4
4     15/09/04                                    12
5     12/10/04        20/06/05                    13
 
est ce possible en SQL ou dois-je passer par du VBA ? je ne vois
vraiment pas comment m'y prendre …
 
Merci d'avance

Reply

Marsh Posté le 09-06-2005 à 16:04:41   

Reply

Marsh Posté le 09-06-2005 à 16:06:40    

Access ne supportant pas les langages de type T-SQL, je pense que tu ne pourras pas faire autrement que de passer par du VBA.

Reply

Marsh Posté le 09-06-2005 à 16:53:03    

si il y a plus de commandes que de livraisons (c'est logique)
un left join devrait faire l'affaire non?

Code :
  1. SELECT Commande.DateCommande,Livraison.DateLivraison,Commande.NoCommande
  2. from Commandes LEFT JOIN Livraisons on Commandes.NoCommande=Livraison.NoCommande


 
ou alors j'ai pas bien saisi la question


Message édité par betsamee le 09-06-2005 à 16:54:30
Reply

Marsh Posté le 09-06-2005 à 17:08:32    

 C'était ma première idée (fausse), mais la requête me sort 39 000 lignes alors que j'ai 3 000 lignes de commandes.
 
  Le N° de commande n'est pas la Clef, il n'est pas unique (puisque je travaille sur les lignes de commande et pas les commandes). Mon intuition (svt trompeuse) me dit que ça vient de là ....
 
bref je me demande si je peux m'en sortir juste en SQL ...
 

Reply

Marsh Posté le 09-06-2005 à 17:13:41    

ze soucy, c'est qu'il n'y a pas d'ID permettant d'associer une ligne de facture à une ligne de livraison à ce que je vois.
à partir de là, impossible de faire une jointure digne de ce nom.

Reply

Marsh Posté le 09-06-2005 à 17:56:50    

Je suis DIEU :sol:
 
J'ai réussi, en SQL pure !
 
Par contre, c'est pas propre :D
 
Limitation :
-> 5 requêtes pour arriver au résultat
-> 2 des requêtes peuvent nécessiter un bon travail de copier/coller : faut faire un "count(*)" sur commande et livraison, groupé par numcde, et avoir autant de union que le plus grand de ces count dans chacune des deux requêtes.
 
Les requêtes :
 
"commande_bis" (c'est là qu'il faut rajouter des UNION en fonction du MAX du COUNT des cde par numcde)

Code :
  1. SELECT 1 as numlig, numcde
  2. from commande
  3. group by numcde
  4. having count(numcde) >= 1
  5. union all
  6. SELECT 2 as numlig, numcde
  7. from commande
  8. group by numcde
  9. having count(numcde) >= 2
  10. union all
  11. SELECT 3 as numlig, numcde
  12. from commande
  13. group by numcde
  14. having count(numcde) >= 3
  15. union all
  16. SELECT 4 as numlig, numcde
  17. from commande
  18. group by numcde
  19. having count(numcde) >= 4
  20. union all
  21. SELECT 5 as numlig, numcde
  22. from commande
  23. group by numcde
  24. having count(numcde) >= 5
  25. union all
  26. SELECT 6 as numlig, numcde
  27. from commande
  28. group by numcde
  29. having count(numcde) >= 6
  30. union all
  31. SELECT 7 as numlig, numcde
  32. from commande
  33. group by numcde
  34. having count(numcde) >= 7
  35. union all
  36. SELECT 8 as numlig, numcde
  37. from commande
  38. group by numcde
  39. having count(numcde) >= 8
  40. union all
  41. SELECT 9 as numlig, numcde
  42. from commande
  43. group by numcde
  44. having count(numcde) >= 9
  45. UNION ALL SELECT 10 as numlig, numcde
  46. from commande
  47. group by numcde
  48. having count(numcde) >= 10;


 
commande_ter :

Code :
  1. SELECT DISTINCT a.date, a.numcde, b.numlig
  2. FROM commande_bis AS b, commande AS a
  3. WHERE a.numcde = b.numcde;


 
livraison_bis (là aussi faut jouer avec les UNION)

Code :
  1. SELECT 1 as numlig, numcde
  2. from livraison
  3. group by numcde
  4. having count(numcde) >= 1
  5. union all
  6. SELECT 2 as numlig, numcde
  7. from livraison
  8. group by numcde
  9. having count(numcde) >= 2
  10. union all
  11. SELECT 3 as numlig, numcde
  12. from livraison
  13. group by numcde
  14. having count(numcde) >= 3
  15. union all
  16. SELECT 4 as numlig, numcde
  17. from livraison
  18. group by numcde
  19. having count(numcde) >= 4
  20. union all
  21. SELECT 5 as numlig, numcde
  22. from livraison
  23. group by numcde
  24. having count(numcde) >= 5
  25. union all
  26. SELECT 6 as numlig, numcde
  27. from livraison
  28. group by numcde
  29. having count(numcde) >= 6
  30. union all
  31. SELECT 7 as numlig, numcde
  32. from livraison
  33. group by numcde
  34. having count(numcde) >= 7
  35. union all
  36. SELECT 8 as numlig, numcde
  37. from livraison
  38. group by numcde
  39. having count(numcde) >= 8
  40. union all
  41. SELECT 9 as numlig, numcde
  42. from livraison
  43. group by numcde
  44. having count(numcde) >= 9
  45. UNION ALL SELECT 10 as numlig, numcde
  46. from livraison
  47. group by numcde
  48. having count(numcde) >= 10;


 
livraison_ter :

Code :
  1. SELECT DISTINCT a.date, a.numcde, b.numlig
  2. FROM livraison_bis AS b, livraison AS a
  3. WHERE a.numcde = b.numcde;


 
final :

Code :
  1. SELECT commande_ter.numcde, commande_ter.numlig, commande_ter.date, livraison_ter.numcde, livraison_ter.numlig, livraison_ter.date
  2. FROM commande_ter LEFT JOIN livraison_ter ON (commande_ter.numcde = livraison_ter.numcde) AND (commande_ter.numlig = livraison_ter.numlig);

Reply

Marsh Posté le 09-06-2005 à 17:57:44    

Testé avec ton jeu de données.
 
Résultat :

Code :
  1. commande_ter.numcde commande_ter.numlig commande_ter.date livraison_ter.numcde livraison_ter.numlig livraison_ter.date
  2. 4 1 12/05/2003 4 1 20/06/2005
  3. 4 1 12/05/2003 4 1 18/06/2003
  4. 4 2 12/05/2003 4 2 20/06/2005
  5. 4 2 12/05/2003 4 2 18/06/2003
  6. 4 3 12/05/2003
  7. 12 1 15/09/2004
  8. 13 1 12/10/2004 13 1 19/11/2004

Reply

Marsh Posté le 09-06-2005 à 18:00:15    

Tiens, attends, j'ai une petite erreur, je cherche !)

Reply

Marsh Posté le 09-06-2005 à 18:02:45    

Putain, elles font chier tes dates de livraison, c'est elles qui foutent le bronx :o

Reply

Marsh Posté le 09-06-2005 à 18:11:54    

Bon, ben pas dieu en fait, juste Shaman, mon ancien titre :D
 
J'arrive pas à m'en sortir, c'est relou ton truc :D

Reply

Marsh Posté le 09-06-2005 à 18:11:54   

Reply

Marsh Posté le 09-06-2005 à 18:26:16    

Bon, ça me gonfle, je rentre chez moi (vais pas faire des heures supp pour corriger un problème qui n'a rien à voir avec mon boulot non plus :D)

Reply

Marsh Posté le 09-06-2005 à 18:27:25    

Citation :


 
SELECT 1 as numlig, numcde  
from commande  
group by numcde  
having count(numcde) >= 1  
union all  
SELECT 2 as numlig, numcde  
from commande  
group by numcde  
having count(numcde) >= 2  
union all  
SELECT 3 as numlig, numcde  
from commande  
group by numcde  
having count(numcde) >= 3  
union all  
SELECT 4 as numlig, numcde  
from commande  
group by numcde  
having count(numcde) >= 4  
union all  
SELECT 5 as numlig, numcde  
from commande  
group by numcde  
having count(numcde) >= 5  
union all  
SELECT 6 as numlig, numcde  
from commande  
group by numcde  
having count(numcde) >= 6  
union all  
SELECT 7 as numlig, numcde  
from commande  
group by numcde  
having count(numcde) >= 7  
union all  
SELECT 8 as numlig, numcde  
from commande  
group by numcde  
having count(numcde) >= 8  
union all  
SELECT 9 as numlig, numcde  
from commande  
group by numcde  
having count(numcde) >= 9  
UNION ALL SELECT 10 as numlig, numcde  
from commande  
group by numcde  
having count(numcde) >= 10;
 
 
 
commande_ter :  
Code :
 
SELECT DISTINCT a.date, a.numcde, b.numlig  
FROM commande_bis AS b, commande AS a  
WHERE a.numcde = b.numcde;
 
 
 
livraison_bis (là aussi faut jouer avec les UNION)  
Code :
 
SELECT 1 as numlig, numcde  
from livraison  
group by numcde  
having count(numcde) >= 1  
union all  
SELECT 2 as numlig, numcde  
from livraison  
group by numcde  
having count(numcde) >= 2  
union all  
SELECT 3 as numlig, numcde  
from livraison  
group by numcde  
having count(numcde) >= 3  
union all  
SELECT 4 as numlig, numcde  
from livraison  
group by numcde  
having count(numcde) >= 4  
union all  
SELECT 5 as numlig, numcde  
from livraison  
group by numcde  
having count(numcde) >= 5  
union all  
SELECT 6 as numlig, numcde  
from livraison  
group by numcde  
having count(numcde) >= 6  
union all  
SELECT 7 as numlig, numcde  
from livraison  
group by numcde  
having count(numcde) >= 7  
union all  
SELECT 8 as numlig, numcde  
from livraison  
group by numcde  
having count(numcde) >= 8  
union all  
SELECT 9 as numlig, numcde  
from livraison  
group by numcde  
having count(numcde) >= 9  
UNION ALL SELECT 10 as numlig, numcde  
from livraison  
group by numcde  
having count(numcde) >= 10;
 


franchement c'est bien pense mais tout ce SQL cafait peur

Reply

Marsh Posté le 09-06-2005 à 19:20:49    

Ben le souci en effet, c'est de réussir à générer des numéro de lignes dans les commandes et les numéros, car c'est ça qui manque le plus : un lien entre numéro de commande et numéro de ligne permettrait de faire la jointure externe.
 
Malheureusement, autant avec un CURSEUR c'est simple comme choux, autant avec Access on ne peut pas utiliser ça.
Avec Oracle, il y a aussi le rownum, qui permettrait d'avoir un semblant de début de solution, mais à nouveau, avec Access ça n'existe pas.
 
Donc ma solution semblait la plus simple a mettre en oeuvre, mais le pépin, c'est ensuite pour les livraisons, les dates étant différentes, on ne peut pas s'en sortir, et on se retrouve avec le même problème :pt1cable:

Reply

Marsh Posté le 17-06-2005 à 10:04:37    

betsamee a écrit :

si il y a plus de commandes que de livraisons (c'est logique)
un left join devrait faire l'affaire non?

Code :
  1. SELECT Commande.DateCommande,Livraison.DateLivraison,Commande.NoCommande
  2. from Commandes LEFT JOIN Livraisons on Commandes.NoCommande=Livraison.NoCommande


 
ou alors j'ai pas bien saisi la question


 
 
C'était presque ça: en fait il faut faire un select distinct

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed