Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/02/2012, 12h16   #1
Invité de passage
 
Inscription : février 2012
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 3
Points : 1
Points : 1
Par défaut Requête sql, trouver une date

Bonjour à tous et à toutes!

J'ai une question à soumettre à l'assemblé :
Le contexte : SQL Server 2008

Je dispose de deux tables :

Une table commande qui contient :

-id article -date commande- prix
LEGUME 01/01/2012 10
LEGUME 01/06/2011 10
LEGUME 01/01/2012 10
LEGUME 01/01/2012 10
LEGUME 01/06/2010 10
LEGUME 01/06/2009 10

Une table historique des coûts articles qui contient :

-id article-date Depart cout- cout
LEGUME 01/01/2012 1,15
LEGUME 01/01/2011 1,10
LEGUME 01/01/2010 1,05
LEGUME 01/01/2009 0,99

Ce que je souhaite c'est trouver pour chaque commande le cout associé (en fonction de la date donc.)

Le résultat que je souhaiterais obtenir est le suivant :
-id article -date commande- prix - cout
LEGUME 01/01/2012 10 1,15
LEGUME 01/06/2011 10 1,10
LEGUME 01/04/2011 10 1,10
LEGUME 01/09/2010 10 1,05
LEGUME 01/06/2010 10 1,05
LEGUME 01/06/2009 10 0,99

Je sèche un peu
Si vous avez des idées, n'hésitez pas!
Brenlem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 12h18   #2
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 987
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 987
Points : 1 700
Points : 1 700
Bonjour,

Tu dois utiliser des jointures.
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 12h36   #3
Invité de passage
 
Inscription : février 2012
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 3
Points : 1
Points : 1
Merci, mais ça je sais.
La seule condition de jointure est sur Id article.
J'ai environ 13,000 lignes dans ma tables commande.
Environ 3,000 dans la table d'historique, avec 800 articles référencés.

Si j'effectue une jointure toute bête, avec commande.id article = historique.id article, je vais me retrouver avec 45,000 lignes, ce n'est pas le but..

J'arrive à spécifier que la date historique doit être inférieure a celle de commande.
Ce que je veux c'est prendre LA date la plus proche dans le passé, et c'est la que je bloque
Brenlem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 12h39   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 688
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 688
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Pour ma part je créerai une vue pour créer des plages de dates, car c'est un besoin dont vous allez avoir probablement souvent besoin.

Vos données :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
CREATE TABLE dbo.Commande
(
    Code_Article     varchar(10)
  , Date_Commande    date
  , Prix             decimal(5,2)
)
 
INSERT INTO dbo.Commande (Code_Article, Date_Commande, Prix)
SELECT 'LEGUME', convert(date, '01/01/2012', 103), 10 union ALL
SELECT 'LEGUME', convert(date, '01/06/2011', 103), 10 union ALL
SELECT 'LEGUME', convert(date, '01/01/2012', 103), 10 union ALL
SELECT 'LEGUME', convert(date, '01/01/2012', 103), 10 union ALL
SELECT 'LEGUME', convert(date, '01/06/2010', 103), 10 union ALL
SELECT 'LEGUME', convert(date, '01/06/2009', 103), 10 
 
CREATE TABLE dbo.Article_Cout_Histo
(
    Code_Article     varchar(10)
  , Date_Depart_Cout date
  , Cout             decimal(5,2)
)
 
INSERT INTO dbo.Article_Cout_Histo (Code_Article, Date_Depart_Cout, Cout)
SELECT 'LEGUME', convert(date, '01/01/2012', 103), 1.15 union ALL
SELECT 'LEGUME', convert(date, '01/01/2011', 103), 1.10 union ALL
SELECT 'LEGUME', convert(date, '01/01/2010', 103), 1.05 union ALL
SELECT 'LEGUME', convert(date, '01/01/2009', 103), 0.99
La vue :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE VIEW dbo.v_Article_Cout_Histo (Code_Article, Date_Depart_Cout, Date_Fin_Cout, Cout)
AS
  SELECT T1.Code_Article
       , T1.Date_Depart_Cout
       , coalesce(DATEADD(day, -1, MIN(T2.Date_Depart_Cout)), convert(date, '31/12/9999', 103))
       , T1.Cout
    FROM dbo.Article_Cout_Histo AS T1
         LEFT OUTER JOIN dbo.Article_Cout_Histo AS T2
           ON T2.Code_Article     = T1.Code_Article
          AND T2.Date_Depart_Cout > T1.Date_Depart_Cout
GROUP BY T1.Code_Article
       , T1.Date_Depart_Cout
       , T1.Cout
La requête :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT CMD.Code_Article
     , CMD.Date_Commande
     , CMD.Prix
     , ACH.Cout
  FROM dbo.Commande AS CMD
       INNER JOIN dbo.v_Article_Cout_Histo AS ACH
         ON ACH.Code_Article = CMD.Code_Article
 WHERE CMD.Date_Commande BETWEEN ACH.Date_Depart_Cout AND ACH.Date_Fin_Cout
 
 
Code_Article Date_Commande Prix  Cout
------------ ------------- ----- ----
LEGUME       2012-01-01    10.00 1.15
LEGUME       2011-06-01    10.00 1.10
LEGUME       2012-01-01    10.00 1.15
LEGUME       2012-01-01    10.00 1.15
LEGUME       2010-06-01    10.00 1.05
LEGUME       2009-06-01    10.00 0.99
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/02/2012, 09h38   #5
Invité de passage
 
Inscription : février 2012
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 3
Points : 1
Points : 1
Merci
Brenlem est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h02.


 
 
 
 
Partenaires

Hébergement Web