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
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
A voir également:
- Probleme requête SQL URGENT
- Requête sql pix - Forum Python
- Récupération serveur sql - Télécharger - Gestion de données
- Sql lister les tables ✓ - Forum Programmation
- Requête sql doublons sur 2 champs ✓ - Forum Programmation
- Erreur lors de l'envoi de la requête facebook marketplace - Forum Facebook
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
28 mai 2008 à 10:08
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)...
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
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?
++
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?
++
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
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?
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
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.
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.
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
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?
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?