Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3039 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  ACCESS / SQL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

ACCESS / SQL

n°1114242
gregb
Posté le 09-06-2005 à 16:04:41  profilanswer
 

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

mood
Publicité
Posté le 09-06-2005 à 16:04:41  profilanswer
 

n°1114249
Arjuna
Aircraft Ident.: F-MBSD
Posté le 09-06-2005 à 16:06:40  profilanswer
 

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.

n°1114400
betsamee
Asterisk Zeperyl
Posté le 09-06-2005 à 16:53:03  profilanswer
 

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
n°1114451
gregb
Posté le 09-06-2005 à 17:08:32  profilanswer
 

 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 ...
 

n°1114469
Arjuna
Aircraft Ident.: F-MBSD
Posté le 09-06-2005 à 17:13:41  profilanswer
 

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.

n°1114571
Arjuna
Aircraft Ident.: F-MBSD
Posté le 09-06-2005 à 17:56:50  profilanswer
 

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);

n°1114574
Arjuna
Aircraft Ident.: F-MBSD
Posté le 09-06-2005 à 17:57:44  profilanswer
 

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

n°1114582
Arjuna
Aircraft Ident.: F-MBSD
Posté le 09-06-2005 à 18:00:15  profilanswer
 

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

n°1114585
Arjuna
Aircraft Ident.: F-MBSD
Posté le 09-06-2005 à 18:02:45  profilanswer
 

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

n°1114595
Arjuna
Aircraft Ident.: F-MBSD
Posté le 09-06-2005 à 18:11:54  profilanswer
 

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

mood
Publicité
Posté le 09-06-2005 à 18:11:54  profilanswer
 

n°1114613
Arjuna
Aircraft Ident.: F-MBSD
Posté le 09-06-2005 à 18:26:16  profilanswer
 

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)

n°1114615
betsamee
Asterisk Zeperyl
Posté le 09-06-2005 à 18:27:25  profilanswer
 

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

n°1114685
Arjuna
Aircraft Ident.: F-MBSD
Posté le 09-06-2005 à 19:20:49  profilanswer
 

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:

n°1122790
pouyotte
Posté le 17-06-2005 à 10:04:37  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  ACCESS / SQL

 

Sujets relatifs
[Résolu] Désactiver la notification d'exécution de requête SQLSQL Access PHP
SQL/PHP et Base de données Accessà l'aide Access/SQL/VBA
Requête SQL pour access[access/SQL]recherche multi-table
SQL Server & Access 2000 db monitoringRequêtes SQL sur une base de données ACCESS en réseau ?
Access SQL et la datedebutant formulaire access et SQL
Plus de sujets relatifs à : ACCESS / SQL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR