IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

[SQL2008] Besoin d'aide pour taper une requête


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Par défaut [SQL2008] Besoin d'aide pour taper une requête
    Bonjours à tous,

    Voila mon problème:
    J'ai une table magasin, une table classe et une table qui fait la relation avec une date de mutation.

    Mon problème c'est que j'ai besoin de connaitre le nom de la classe la plus récente à une date donnée.

    Je joint un script de création de table et données.
    Par exemple j'ai besoin de savoir que le 01.03.2012 le magasin M3 était en classe C1 etc..

    Actuellement j'ai un INNER JOIN sur le résultat d'un CROSS APPLY mais ça ne me plait pas du tout

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    CREATE TABLE [dbo].[_tblTst_Classe](
    	IdClasse [int] NOT NULL,
    	Code [char](2) NULL,
     CONSTRAINT [PK__tblTst_Classe] PRIMARY KEY CLUSTERED 
    (
    	[IdClasse] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
     
    CREATE TABLE [dbo].[_tbltst_ClasseMagHisto](
    	[IdHisto] [int] NOT NULL,
    	[DTMutation] [datetime] NOT NULL,
    	[IdMag] [int] NOT NULL,
    	[IdClasse] [int] NOT NULL,
     CONSTRAINT [PK__tbltst_ClasseMagHisto] PRIMARY KEY CLUSTERED 
    (
    	[IdHisto] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
     
    CREATE TABLE [dbo].[_TblTst_Mag](
    	[IdMag] [int] NOT NULL,
    	[NomMag] [varchar](10) NOT NULL,
     CONSTRAINT [PK__TblTst_Mag] PRIMARY KEY CLUSTERED 
    (
    	[IdMag] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
     
    ALTER TABLE [dbo].[_tbltst_ClasseMagHisto]  WITH CHECK ADD  CONSTRAINT [FK__tbltst_ClasseMagHisto__tblTst_Classe] FOREIGN KEY([IdClasse])
    REFERENCES [dbo].[_tblTst_Classe] ([IdClasse])
    GO
     
    ALTER TABLE [dbo].[_tbltst_ClasseMagHisto] CHECK CONSTRAINT [FK__tbltst_ClasseMagHisto__tblTst_Classe]
    GO
     
    ALTER TABLE [dbo].[_tbltst_ClasseMagHisto]  WITH CHECK ADD  CONSTRAINT [FK__tbltst_ClasseMagHisto__TblTst_Mag] FOREIGN KEY([IdMag])
    REFERENCES [dbo].[_TblTst_Mag] ([IdMag])
    GO
     
    ALTER TABLE [dbo].[_tbltst_ClasseMagHisto] CHECK CONSTRAINT [FK__tbltst_ClasseMagHisto__TblTst_Mag]
    GO
     
     
    ---------------
    --DATA
    --------------
    INSERT      INTO              _TblTst_Mag(IdMag, NomMag)
    VALUES        (1,'M1'),(2,'M2'),(3,'M3'),(4,'M4')
    GO
    INSERT      INTO              _tbltst_classe(IdClasse, Code)
    VALUES        (1,'C1'),(2,'C2'),(3,'C3'),(4,'C4')
    GO
    INSERT  INTO  _tbltst_ClasseMagHisto(IdHisto, DtMutation,IdMag,IdClasse)
    VALUES        (1 ,'20120101',1,1)
    			 ,(2 ,'20120201',2,1)
    			 ,(3 ,'20120301',2,2)
    			 ,(4 ,'20120101',3,4)
    			 ,(5 ,'20120201',3,3)
    			 ,(6 ,'20120401',3,2)
    			 ,(7 ,'20120301',3,1)
    			 ,(8 ,'20120101',4,3)
    			 ,(9 ,'20120601',4,1)
    			 ,(10,'20120201',4,3)

  2. #2
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Par défaut
    Bonjour,

    Si je comprends bien, récupérer le max IdHisto pour une date données et effectuer les INNER JOIN sur les tables/colonnes de la ligne récupérée.

    Plusieurs solutions...
    Via une CTE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WITH cte AS (
    SELECT MAX(IdHisto) AS IdHisto FROM _tbltst_ClasseMagHisto
    WHERE DtMutation = '20120301'
    )
    SELECT M.NomMag, C.Code
    FROM cte 
    INNER JOIN _tbltst_ClasseMagHisto H ON cte.IdHisto = H.IdHisto
    INNER JOIN _TblTst_Mag M ON H.IdMag = M.IdMag
    INNER JOIN _tbltst_classe C ON H.IdClasse = C.IDClasse
    Via une sous requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT M.NomMag, C.Code
    FROM _tbltst_ClasseMagHisto H 
    INNER JOIN _TblTst_Mag M ON H.IdMag = M.IdMag
    INNER JOIN _tbltst_classe C ON H.IdClasse = C.IDClasse
    WHERE H.IdHisto = (SELECT MAX(IdHisto) FROM _tbltst_ClasseMagHisto WHERE DtMutation = '20120301')

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Par défaut
    Exact, mais il manque la notion de magasin.

    Par exemple si je veux la liste de tout les magasins et leur classe à une date donnée. (comme d'hab en informatique l'information arrive par acous désolé )

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    J'ai pas très bien saisi.

    Vous voulez, pour tous les magasin, connaître leur classe à une date donnée ?

    Ben c'est symple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    with cte as
    (
       select IdMag, max(dtmutation)
       from _tbltst_ClasseMagHisto
       where dtmutation <= 'madate'
       group by IdMag
    )
    select h.idmag, h.idclasse
    from _tbltst_ClasseMagHisto h
    inner join cte on cte.idmag = h.idmag and cte.dtmutation = h.dtmutation

    Après, je vous laisse faire la jointure sur les tables classe et magasin pour avoir le détail de ces derniers.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Par défaut
    Je ne suis pas sûr de bien comprendre, mais la liste de tous les magasins à une date donnée me semble encore plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT M.NomMag, C.Code
    FROM _tbltst_ClasseMagHisto H 
    INNER JOIN _TblTst_Mag M ON H.IdMag = M.IdMag
    INNER JOIN _tbltst_classe C ON H.IdClasse = C.IDClasse
    WHERE H.DtMutation = '20120301'
    Si je suis à côté de la plaque, n'hésite pas à donner des exemples plus précis et le code de ta requête avec le CROSS APPLY

    EDIT: StringBuilder doit être plus prêt de la solution effectivement, la requête ci-jointe ne retourne que les magasins qui sont référencés par la date donnée.

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Par défaut
    Toute mes excuses,
    c'est par ce que j'ai du mal a exprimer ma problématique.

    Supposons que j'ai une table commande avec une date de mise en vente.

    Je vais vouloir tirer une statistique de toute mes commandes et pour chaque commande la classe de chaque magasin à la date de mise en vente...

    C'est peut être pas plus claire

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Par défaut
    Voila mon exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT M.NomMag,C.Code
    FROM _TblTst_Mag M 
    CROSS APPLY (
    	   SELECT max(dtmutation) Val
    	   FROM _tbltst_ClasseMagHisto
    	   WHERE IdMag=M.IdMag
    	) CA
    INNER JOIN _tbltst_ClasseMagHisto CM ON M.IDMAG=CM.IDMAG AND CM.dtmutation=CA.Val
    INNER JOIN _tbltst_classe C ON C.IDClasse = CM.IdClasse
    La dessus j'ajoute un INNER JOIN sur un table qui fournis les dates
    ça marche dans le principe mais c'est dégeu de devoir lier a double sur la même table juste pour faire le liens avec la donnée recherchée

  8. #8
    Membre actif
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 128
    Par défaut
    Citation Envoyé par Donpi Voir le message
    J'ai une table magasin, une table classe et une table qui fait la relation avec une date de mutation.

    Mon problème c'est que j'ai besoin de connaitre le nom de la classe la plus récente à une date donnée.

    Par exemple j'ai besoin de savoir que le 01.03.2012 le magasin M3 était en classe C1 etc..
    Voici la requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE @curr_date date = '20120215';
     
    SELECT CMH.DTMutation, M.NomMag, C.Code
    FROM _tbltst_ClasseMagHisto CMH
    INNER JOIN _tblTst_Classe C ON CMH.IdClasse = C.IdClasse
    INNER JOIN _TblTst_Mag M ON CMH.IdMag = M.IdMag
    INNER JOIN
    (
    	SELECT max(DTMutation) AS MaxDTMutation, IdMag 
    	FROM _tbltst_ClasseMagHisto
    	WHERE DtMutation <= @curr_date
    	GROUP BY IdMag
    ) MM
    ON CMH.DTMutation = MM.MaxDTMutation AND CMH.IdMag = MM.IdMag

Discussions similaires

  1. Besoin d'aide pour créer une requête
    Par cedric/copy dans le forum ASP
    Réponses: 6
    Dernier message: 13/03/2009, 17h29
  2. Besoin d'aide pour créer une requête
    Par fabien59420 dans le forum Requêtes et SQL.
    Réponses: 44
    Dernier message: 26/05/2008, 12h08
  3. [MySQL] besoin d'aide pour exécuter une requête et en récupérer le résultat
    Par fast462 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 28/05/2007, 11h30
  4. besoin d 'aide pour formuler une requête
    Par cdu dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/04/2006, 20h38
  5. besoin d'aide pour optimiser une requête
    Par jisse dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2006, 10h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo