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 :

extraire 10 occurrences d'une table pour chaque occurrence d'une autre table


Sujet :

Développement SQL Server

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    272
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2008
    Messages : 272
    Par défaut extraire 10 occurrences d'une table pour chaque occurrence d'une autre table
    Bonjour tout le monde,

    je pense que le titre de mon message est plus ou moins clair mais plus concrètement j'aurais voulu récupérer les 10 dernières commandes pour l'ensemble des articles de ma base. Cela ne fait intervenir que deux de mes tables (articles et commande) mais je ne sais comment faire cette extraction.

    Je pourrais certes passer par une procédure et stocker mes résultats au fur et à mesure dans une autre table mais je préfèrerais passer par une requête.

    Alors si quelqu'un à une idée je prends avec grand plaisir!

    Merci et bonne journée à tous

  2. #2
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Bonjour,

    La charte de postage est votre ami. Elle nous permettra également de mieux vous aider dans votre demande

    ++

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Voici un exemple qui suppose que vous utilisez au moins la version 2005 de SQL Server, et qui retourne les deux dernières commandes pour chaque article :

    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
    72
    CREATE TABLE article
    (
    	id_article int NOT NULL IDENTITY CONSTRAINT PK_article PRIMARY KEY
    	, nom_article varchar(64) NOT NULL CONSTRAINT UQ_article__nom_article UNIQUE
    )
    GO
     
    CREATE TABLE commande
    (
    	id_commande bigint NOT NULL IDENTITY CONSTRAINT PK_commande PRIMARY KEY
    	, id_article int NOT NULL CONSTRAINT FK_commande__id_article FOREIGN KEY (id_article) REFERENCES article
    	, quantite_article numeric(10,2) NOT NULL CONSTRAINT CHK_commande__quantite CHECK (quantite_article > 0.0)
    	, date_commande datetime NOT NULL CONSTRAINT DF_commande__date_commande DEFAULT (GETDATE())
    )
    GO
     
    INSERT INTO dbo.article (nom_article) VALUES ('un article')
    INSERT INTO dbo.article (nom_article) VALUES ('un autre article')
    GO
     
    INSERT INTO dbo.commande (id_article, quantite_article) VALUES (1, 12)
    WAITFOR DELAY '00:00:02'
    GO
     
    INSERT INTO dbo.commande (id_article, quantite_article) VALUES (1, 2)
    WAITFOR DELAY '00:00:02'
    GO
     
    INSERT INTO dbo.commande (id_article, quantite_article) VALUES (1, 26)
    WAITFOR DELAY '00:00:02'
    GO
     
    INSERT INTO dbo.commande (id_article, quantite_article) VALUES (2, 3)
    WAITFOR DELAY '00:00:02'
    GO
     
    INSERT INTO dbo.commande (id_article, quantite_article) VALUES (2, 15)
    WAITFOR DELAY '00:00:02'
    GO
     
    INSERT INTO dbo.commande (id_article, quantite_article) VALUES (2, 60)
    WAITFOR DELAY '00:00:02'
    GO
     
    --SELECT * FROM dbo.article
    --SELECT * FROM dbo.commande
     
    ;WITH
    	CTE_DERNIERES_COMMANDES AS
    	(
    		SELECT	id_article
    			, date_commande
    		FROM
    		(
    			SELECT	id_article
    				, date_commande
    				, ROW_NUMBER() OVER(PARTITION BY id_article ORDER BY date_commande DESC) AS n
    			FROM	dbo.commande
    		) AS TMP
    		WHERE n <= 2
    	)
     
    SELECT		A.nom_article
    		, C.quantite_article
    		, C.date_commande
    FROM		dbo.article AS A
    INNER JOIN	dbo.commande AS C
    			ON A.id_article = C.id_article
    INNER JOIN	CTE_DERNIERES_COMMANDES AS CDC
    			ON CDC.id_article = C.id_article
    			AND CDC.date_commande = C.date_commande
    ORDER BY	A.nom_article, C.date_commande
    @++

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    272
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2008
    Messages : 272
    Par défaut
    Re bonjour,

    Tout d'abord un grand merci d'avoir répondu si vite et pardon si je n'ai pas respecter les règles de postage, je m'y efforcerai à l'avenir.

    elsuket ta solution est nickel, c'est pile poil ce qu'il me fallait. J'ai pas vraiment tout pigé mais ça va bien finir par venir.

    Encore merci et une bonne journée

    Julius

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Dans l'expression de table commune CTE_DERNIERES_COMMANDES, je calcule le rang des commandes (ROW_NUMBER()) pour chaque article (PARTITION BY id_article).
    Pour cela je me base sur la date de commande (ORDER BY date_commande DESC).
    Cela me permet d'extraire les deux dernières commandes pour tout article.

    Or, je ne peux obtenir d'autres informations sur ces commandes qu'à partir de l'id_article et de la date de la commande, puisque c'est une façon directe d'identifier une commande, ce qui explique la jointure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INNER JOIN	CTE_DERNIERES_COMMANDES AS CDC
    			ON CDC.id_article = C.id_article
    			AND CDC.date_commande = C.date_commande
    Pour en savoir un peu plus sur le CTE, voyez par ici cet article de SQLPro, et un petit billet ici

    @++

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    272
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2008
    Messages : 272
    Par défaut
    Wow génial!

    Et re merci pour ces informations, j'ai bien fait de me lever aujourd'hui j'apprends plein de choses. Je m'y attarderai plus attentivement cet après-midi là suis un peu à la bourre.

    Julius

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. créer une hashmap pour chaque élément d'une liste
    Par lealeblanc dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 30/05/2015, 16h23
  2. [MySQL] Créer une section pour chaque valeur d'une colonne
    Par helrick dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 14/08/2013, 00h23
  3. Réponses: 4
    Dernier message: 14/10/2011, 16h18
  4. Réponses: 3
    Dernier message: 16/04/2009, 12h00
  5. Réponses: 5
    Dernier message: 16/02/2007, 16h03

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