Probleme requête SQL URGENT

Résolu/Fermé
Cormega92 Messages postés 39 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 12 mai 2010 - 28 mai 2008 à 09:51
Cormega92 Messages postés 39 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 12 mai 2010 - 28 mai 2008 à 10:49
Bonjour,

Je n'arrive pas à réaliser la requête SQL suivante : J'ai une table FactureFournisseur avec un IdArticle, NomArticle, et DateCommande. Je dois faire en sorte d'afficher la première et la dernière date de commande pour chaque article. Le problème est qu'à chaque fois qu'un article est recommandé une nouvel enregistrement se créé dans la BDD ce qui fait que plusieurs enregistrements ont le même IdArticle. L'idée serait donc de faire une requête disant que quand un IdArticle est égal à lui même, prendre le min et le max de DateCommande sous le nom de DatePremiereCommande et DateDerniereCommande. Après de multiples essais je bloque complètement c'est pour cela que je sollicite votre aide.

Merci

4 réponses

macgawel Messages postés 664 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 1 novembre 2008 89
28 mai 2008 à 10:08
Essaye ça :

SELECT IdArticle, MIN(DateCommande), MAX(DateCommande) from FactureFournisseur
GROUP BY IdArticle;

Tu prends le min et le max des DateCommande, pour chaque IdArticle (clause GROUP BY)...
1
sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
28 mai 2008 à 10:13
Salut,

CREATE TABLE facturefournisseur (idarticle INT, nomarticle VARCHAR2(100), datecommande DATE);

INSERT INTO facturefournisseur
VALUES (1, 'nom art 1', SYSDATE - 2);
INSERT INTO facturefournisseur
VALUES (1, 'nom art 1', SYSDATE - 3);
INSERT INTO facturefournisseur
VALUES (1, 'nom art 1', SYSDATE);

INSERT INTO facturefournisseur
VALUES (2, 'nom art 2', SYSDATE - 2);
INSERT INTO facturefournisseur
VALUES (2, 'nom art 2', SYSDATE - 3);
INSERT INTO facturefournisseur
VALUES (2, 'nom art 2', SYSDATE);

COMMIT ;

SELECT MAX (datecommande), MIN (datecommande), idarticle
FROM facturefournisseur
GROUP BY idarticle;

==>

MAX(DATECOMMANDE) MIN(DATECOMMANDE) IDARTICLE
28/05/2008 09:56:38 25/05/2008 09:56:38 1
28/05/2008 09:56:38 25/05/2008 09:56:38 2


Est-ce que cela te va?

++
0
Cormega92 Messages postés 39 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 12 mai 2010 2
28 mai 2008 à 10:17
Je te remercie ca marche j'étais parti sur des requêtes imbriquées alors que c'était simple mais juste pour info c quoi dans ta requête qui supprime les doublons IdArticle? C'est le GROUP BY? Je croyais que cela servait seulement à classer les champs?
0
macgawel Messages postés 664 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 1 novembre 2008 89
28 mai 2008 à 10:29
Voir ici : https://www.commentcamarche.net/contents/1070-sql-tri

Le GROUP BY est un opérateur ensembliste.

A la base :
On a créé des opérateurs qui travaillent sur des ensembles (somme,moyenne, min, max, ...), parce que c'est 'achement utile.
SELECT MAX(Date) from MaTable;

Mais comme on a souvent besoin de détailler ce genre de choses par groupe, on obtient des requêtes de ce genre :
SELECT Id, MAX(Date) from MaTable;

Le problème, c'est que SQL ne sait pas les gérer tel que (pour lui, un MAX se calcule sur tous les enregistrements, donc il ne sait pas quel Id sélectionner).

La solution est donc de lui préciser ce qu'il faut regrouper :
SELECT Id, MAX(Date) from MaTable GROUP BY Id;

En pratique, on met dans le GROUP BY tous les champs qu'on SELECT et sur lesquels on n'applique pas d'opérateur de groupe.
0
Cormega92 Messages postés 39 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 12 mai 2010 2
28 mai 2008 à 10:49
Merci encore pour cette explication. Vu la rapidité et la clarté de vos réponses je me permet de vous demander de m'aider sur un dernier point. En fait cette requête doit s'ajouter à un autre "groupement" de requêtes.
Voici la requête sans les dates de commandes:

SELECT Article.Code, Article.Nom, Article.FINSTOCK AS FinStock, Article.FRN5 AS Frn, Article.DerPa, Article.ReliquatClient AS CdeClt, Article.ReliquatFseur AS CdeFour, [N -0 Facture].SommeDeQuantite AS 2008, [N-1 FACTURE].SommeDeQuantite AS 2007, [n-2 FACTURE].SommeDeQuantite AS 2006, Article.Coefficient AS Coef, Article.StockPhyGen AS [St-phy,]
FROM (([N-1 FACTURE] RIGHT JOIN Article ON [N-1 FACTURE].CodeArticle = Article.Code) LEFT JOIN [n-2 FACTURE] ON Article.Code = [n-2 FACTURE].CodeArticle) LEFT JOIN [N -0 Facture] ON Article.Code = [N -0 Facture].CodeArticle
GROUP BY Article.Code, Article.Nom, Article.FINSTOCK, Article.FRN5, Article.DerPa, Article.ReliquatClient, Article.ReliquatFseur, [N -0 Facture].SommeDeQuantite, [N-1 FACTURE].SommeDeQuantite, [n-2 FACTURE].SommeDeQuantite, Article.Coefficient, Article.StockPhyGen, Article.Sommeil
HAVING (((Article.Code) Is Null Or (Article.Code) Is Not Null) AND ((Article.Sommeil)=0))
ORDER BY Article.Code;

avec les dates de commandes (pour info les noms de variables que je vous ai donné n'était pas ceux utilisés dans le code):

SELECT Article.Code, Article.Nom, Article.FINSTOCK AS FinStock, Article.FRN5 AS Frn, Article.DerPa, Article.ReliquatClient AS CdeClt, Article.ReliquatFseur AS CdeFour, [N -0 Facture].SommeDeQuantite AS 2008, [N-1 FACTURE].SommeDeQuantite AS 2007, [n-2 FACTURE].SommeDeQuantite AS 2006, Article.Coefficient AS Coef, Article.StockPhyGen AS [St-phy,], MIN(DateDocument) AS DatePremierAchat, MAX(DateDocument) AS DateDernierAchat
FROM LigneFactureFournisseur INNER JOIN ((([N-1 FACTURE] RIGHT JOIN Article ON [N-1 FACTURE].CodeArticle = Article.Code) LEFT JOIN [n-2 FACTURE] ON Article.Code = [n-2 FACTURE].CodeArticle) LEFT JOIN [N -0 Facture] ON Article.Code = [N -0 Facture].CodeArticle) ON LigneFactureFournisseur.CodeArticle = Article.Code
GROUP BY CodeArticle, Article.Code, Article.Nom, Article.FINSTOCK, Article.FRN5, Article.DerPa, Article.ReliquatClient, Article.ReliquatFseur, [N -0 Facture].SommeDeQuantite, [N-1 FACTURE].SommeDeQuantite, [n-2 FACTURE].SommeDeQuantite, Article.Coefficient, Article.StockPhyGen, Article.Sommeil, LigneFactureFournisseur.DateDocument
HAVING (((Article.Code) Is Null Or (Article.Code) Is Not Null) AND ((Article.Sommeil)=0))
ORDER BY Article.Code;

Le GROUP BY CodeArticle me donne un message d'erreur et si je l'enlève je me retrouve encore avec mon problème d'avoir plusieurs lignes pour le même article et par conséquent le calcul des dates ne marche plus. Pourquoi?
0