Probleme requête SQL URGENT
Résolu
Cormega92
Messages postés
39
Date d'inscription
Statut
Membre
Dernière intervention
-
Cormega92 Messages postés 39 Date d'inscription Statut Membre Dernière intervention -
Cormega92 Messages postés 39 Date d'inscription Statut Membre Dernière intervention -
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
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
A voir également:
- Probleme requête SQL URGENT
- Logiciel sql - Télécharger - Bases de données
- Sql lister les tables ✓ - Forum Programmation
- Requête bloquée par le pare-feu applicatif claranet webfence ✓ - Forum Réseaux sociaux
- Jointure sql ✓ - Forum MySQL
- Erreur lors de l'envoi de la requête facebook - Forum Facebook
4 réponses
Essaye ça :
Tu prends le min et le max des DateCommande, pour chaque IdArticle (clause GROUP BY)...
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)...
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?
++
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?
++
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?
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.
Mais comme on a souvent besoin de détailler ce genre de choses par groupe, on obtient des requêtes de ce genre :
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 :
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.
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.
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?
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?