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 :

Trouver uniquement la derniere entrée pour un produit


Sujet :

Développement SQL Server

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Débutant
    Inscrit en
    juillet 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : juillet 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut Trouver uniquement la derniere entrée pour un produit
    Bonjour,

    Des produits sont donner aux employés. (des centaines de produits / des milliers d'employés).
    Je garde les infos pour la transaction quand un employé reçoit un produit.
    J'aimerai trouver, pour un produit spécifique, la dernière transaction pour chaque employé.
    Avec mon code je reçois tous les transactions.

    Voici mon code:
    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
    -- Cette liste ramène les informations pour un produit ayant un numéro de produit
     
    DECLARE @Produit VARCHAR(50); 
     
    SET @Produit = '8465-1-05-0%'; -- L'utilisateur de la requête va modifier les chiffre pour trouver un autre produit
     
    SELECT DISTINCT
     
      in_items_sn.in_date         AS 'Date_entrée'
    , ve_livraisons.re_clients_id AS 'Client_livr'
    , re_clients.description      AS 'Desc_client_livr'
    , in_items_sn.out_date        AS 'Date_sortie'
    , in_items_sn.id              AS 'No_Serie'
    , in_items_sn.in_items_id     AS 'No_Prod'
    , in_items_sn.description     AS 'Desc_Prod'
    , CASE -- selon type de transaction, inscrire le statut du produit
           WHEN  in_items_sn.in_type = '0' -- statut produit livré au membre
                     THEN 'En circulation'
           WHEN  in_items_sn.in_type = '4' -- statut produit en attente de distribution
                     THEN 'Reçu - À distribuer'
           WHEN  in_items_sn.in_type = '8' -- statut produit retourné (en stock)
                     THEN 'Retourné - à redistribuer'
              ELSE  'Produit en statut inconnu'
       END                        AS 'statut_produit' -- case in_Type numéro de série
     
    FROM in_items_sn
     
    LEFT OUTER JOIN ve_livraisons 
             ON ve_livraisons.id = in_items_sn.out_source_id
     
    LEFT OUTER JOIN re_clients
             ON re_clients.id = ve_livraisons.re_clients_id
     
    LEFT OUTER JOIN rt_clients 
                   ON rt_clients.id = in_items_sn.in_source_id
     
    LEFT OUTER JOIN ac_livraisons
                   ON ac_livraisons.id = in_items_sn.in_source_id
     
    WHERE 
        in_items_sn.in_items_id like @Produit
    Voici le résultat :

    date_entrée client_livr desc_client_livr date_sortie no_serie no_prod desc_prod statut_produit
    2019-07-10 15038 Derick M 2019/07/10 420437 8465-1-05-072 Bâton En circulation
    2019-06-28 11915 Eve G 2019/06/28 287219 8465-1-05-072 Bâton En circulation
    2010-05-21 11838 Danny P 2010/05/21 422860 8465-1-05-072 Bâton En circulation
    2010-05-21 11915 Eve G 2010/05/21 350704 8465-1-05-072 Bâton En circulation


    Merci beaucoup pour votre aide.

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    février 2010
    Messages
    3 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    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 : 3 736
    Points : 6 480
    Points
    6 480
    Billets dans le blog
    1
    Par défaut
    Une solution :

    Regarde du côté de la fonction "rank() over (partition by in_items_sn.in_items_id order by in_items_sn.out_date desc)

    En mettant ta requête actuelle (+ le rank) dans une CTE, puis en filtrant le tout par rang = 1 tu ne devrais plus avoir que les lignes les plus récentes.
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Débutant
    Inscrit en
    juillet 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : juillet 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut Merci StringbBuilder
    Salut,

    J'ai ajouté dans mon code
    RANK() OVER (PARTITION BY ve_livraisons.re_clients_id ORDER BY in_items_sn.in_date DESC) RankDate
    et
    ORDER BY
    RankDate, Date_entrée DESC
    Maintenant j'ai les dernières transaction.
    Merci.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Débutant
    Inscrit en
    juillet 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : juillet 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut requête SQL invalide
    Bonjour,
    pourquoi ma requête est invalide.

    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
    -- Cette liste ramène les informations pour un produit ayant un numéro de produit -- choisi par client 
     
    DECLARE @Produit VARCHAR(50); 
     
    SET @Produit = '8465-1-05-0%'; -- Modifier le chiffre pour trouver un autre produit
     
    WITH Rank_CTE (Date_entrée, Client_livr, Desc_client_livr, Date_sortie, No_Serie, No_Prod, Desc_Prod, statut_produit)
    AS 
    (
    	SELECT DISTINCT
    		in_items_sn.in_date            AS 'Date_entrée'
    		, ve_livraisons.re_clients_id AS 'Client_livr'
    		, re_clients.description        AS 'Desc_client_livr'
    		, in_items_sn.out_date        AS 'Date_sortie'
    		, in_items_sn.id                  AS 'No_Serie'
    		, in_items_sn.in_items_id    AS 'No_Prod'
    		, in_items_sn.description     AS 'Desc_Prod'
    		, CASE -- selon type de transaction, inscrire le statut du produit
    			WHEN  in_items_sn.in_type = '0' -- statut produit livré au membre
    				THEN 'En circulation'
    			WHEN  in_items_sn.in_type = '4' -- statut produit en attente de distribution
                    THEN 'Reçu - À distribuer'
    			WHEN  in_items_sn.in_type = '8' -- statut produit retourné (en stock)
                    THEN 'Retourné - à redistribuer'
    			ELSE  'Produit en statut inconnu'
    		END                        AS 'statut_produit' -- case in_Type numéro de série
    		, RANK() OVER (PARTITION BY ve_livraisons.re_clients_id order by in_items_sn.in_date DESC) RankDate
    	FROM in_items_sn
    		LEFT OUTER JOIN ve_livraisons 
    			ON ve_livraisons.id = in_items_sn.out_source_id
    		LEFT OUTER JOIN re_clients
    			ON re_clients.id = ve_livraisons.re_clients_id
    		LEFT OUTER JOIN rt_clients 
                ON rt_clients.id = in_items_sn.in_source_id
    		LEFT OUTER JOIN ac_livraisons
                ON ac_livraisons.id = in_items_sn.in_source_id
    	WHERE 
    		in_items_sn.in_items_id like @Produit
    		AND
    		ve_livraisons.re_clients_id BETWEEN '1' AND '99999'
    	ORDER BY
    		RankDate, Date_entrée DESC
    )
     
    SELECT *
    FROM Rank_CTE
    WHERE RankDate = 1

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    février 2010
    Messages
    3 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    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 : 3 736
    Points : 6 480
    Points
    6 480
    Billets dans le blog
    1
    Par défaut

    => Cette colonne n'est pas présente dans la liste des colonnes de la CTE
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Débutant
    Inscrit en
    juillet 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : juillet 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    salut,

    nope, meme avec j'ai le meme mesaje d'erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WITH Rank_CTE (Date_entrée, Client_livr, Desc_client_livr, Date_sortie, No_Serie, No_Prod, Desc_Prod, statut_produit, RankDate)
    AS...

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    février 2010
    Messages
    3 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    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 : 3 736
    Points : 6 480
    Points
    6 480
    Billets dans le blog
    1
    Par défaut
    Et c'est quoi le message d'erreur ?
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Débutant
    Inscrit en
    juillet 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : juillet 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    voici l'ereur
    Nom : erreurSQL.gif
Affichages : 56
Taille : 14,7 Ko

  9. #9
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    février 2010
    Messages
    3 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    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 : 3 736
    Points : 6 480
    Points
    6 480
    Billets dans le blog
    1
    Par défaut
    Exécute ta requête dans un vrai requêteur... genre SQL Server Management Studio.
    https://docs.microsoft.com/fr-fr/sql...ql-server-2017

    S'il y a un message d'erreur, il sera clair.
    Sinon, c'est que ton programme tente de comprendre/modifier la requête et n'y parvient pas.
    On ne jouit bien que de ce qu’on partage.

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Débutant
    Inscrit en
    juillet 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : juillet 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut j'ai trouvé l'erreur
    Bonjour,
    on peux pas utiliser ORDER BY avec WITH (https://docs.microsoft.com/en-us/sql...ql-server-2017)
    "•The following clauses cannot be used in the CTE_query_definition:
    ◦ORDER BY (except when a TOP clause is specified)
    -etc.
    "
    donc, j'ai utiliser OREDER BY a l'extérieur du WITH et voici le résultat, j'ai les dernières transactions pour 1 produit.
    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
     
    -- Cette liste ramène les derniere transactions pour un produit, ayant un numéro de produit choisi par client 
     
    DECLARE @Produit VARCHAR(50); 
     
    SET @Produit = '8465-1-05-0%'; -- Modifier le chiffre pour trouver un autre produit
     
    WITH Rank_CTE (Date_entrée, Client_livr, Desc_client_livr, Date_sortie, No_Serie, No_Prod, Desc_Prod, statut_produit, RankDate)
    AS 
    (
    	SELECT DISTINCT
    		in_items_sn.in_date			AS 'Date_entrée'
    		, ve_livraisons.re_clients_id 	AS 'Client_livr'
    		, re_clients.description		AS 'Desc_client_livr'
    		, in_items_sn.out_date		AS 'Date_sortie'
    		, in_items_sn.id				AS 'No_Serie'
    		, in_items_sn.in_items_id		AS 'No_Prod'
    		, in_items_sn.description		AS 'Desc_Prod'
    		, CASE -- selon type de transaction, inscrire le statut du produit
    			WHEN  in_items_sn.in_type = '0' -- statut produit livré au membre
    				THEN 'En circulation'
    			WHEN  in_items_sn.in_type = '4' -- statut produit en attente de distribution
                    THEN 'Reçu - À distribuer'
    			WHEN  in_items_sn.in_type = '8' -- statut produit retourné (en stock)
                    THEN 'Retourné - à redistribuer'
    			ELSE  'Produit en statut inconnu'
    		END                        		AS 'statut_produit' -- case in_Type numéro de série
    		, RANK() OVER (PARTITION BY ve_livraisons.re_clients_id order by in_items_sn.in_date DESC) RankDate
    	FROM in_items_sn
    		LEFT OUTER JOIN ve_livraisons 
    			ON ve_livraisons.id = in_items_sn.out_source_id
    		LEFT OUTER JOIN re_clients
    			ON re_clients.id = ve_livraisons.re_clients_id
    		LEFT OUTER JOIN rt_clients 
                ON rt_clients.id = in_items_sn.in_source_id
    		LEFT OUTER JOIN ac_livraisons
                ON ac_livraisons.id = in_items_sn.in_source_id
    	WHERE 
    		in_items_sn.in_items_id like @Produit
    		AND
    		ve_livraisons.re_clients_id BETWEEN '1' AND '99999'
    )
     
    SELECT *
    FROM Rank_CTE
    WHERE RankDate = 1
    ORDER BY Date_entrée DESC
    MERCI pour votre aide.

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Débutant
    Inscrit en
    juillet 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : juillet 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Exécute ta requête dans un vrai requêteur... genre SQL Server Management Studio.
    https://docs.microsoft.com/fr-fr/sql...ql-server-2017

    S'il y a un message d'erreur, il sera clair.
    Sinon, c'est que ton programme tente de comprendre/modifier la requête et n'y parvient pas.
    J'aimerai bien, mais je n'ai pas accès. Je fais les requêtes dans cette application, parce que les BD sont accessibles juste par cette application et je ne suis pas dans l'équipe de développement (je suis le pilote de l'application et je dois répondre à des demandes fait par les usagers de cette application)

    Merci.

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    Débutant
    Inscrit en
    juillet 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : juillet 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut trouve tous les produits (l'inventaire)
    On a trouvé la dernière transaction pour un seul produit pour chaque client.
    Maintenant, je dois trouvé son inventaire, tous les produits.
    J'ai trouvé le produits, sauf que je dois retenir juste les produits qui ne se répète pas (ex: le client a recu en 2017 un pantalon, mais il a recu un autre en 2108 et finalment un autre en 2019).
    Le client a reçu aussi un produit en 2018, ex: une veste, mais en 2019 n'a pas reçu.
    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
     
    WITH CLIENTS_CTE (client, prenom_nom)
    AS 
    (
        SELECT 
            id AS 'client'
            , description AS 'prenom_nom'
     
        FROM re_clients
        WHERE 
            re_clients.modified_date > '2019-01-01'
    	AND
            re_clients.champ10 = 'nouveau'
    ),
     
    INV_CTE (client, prenom_nom, date_livr, no_produit, produit_reçu, date_reçu_client, RankResult)
    AS
    (
    	SELECT DISTINCT
    		client                                         
    		, prenom_nom
    		, ve_livraisons.date_livr AS 'date_livr'
    		, ve_livraisons_ln.in_items_id AS 'no_produit'
                    , ve_livraisons_ln.description  AS 'produit_reçu'
                    , ve_livraisons_ln.date_livr AS 'date_reçu_client'
     
            , RANK() OVER (PARTITION BY ve_livraisons_ln.in_items_id ORDER BY ve_livraisons_ln.date_livr DESC) RankResult
     
    	FROM CLIENTS_CTE
     
        INNER JOIN ve_livraisons
            ON client = ve_livraisons.re_clients_id
     
    	INNER JOIN ve_livraisons_ln
            ON ve_livraisons_ln.ve_livraisons_id = ve_livraisons.id
    )
     
    SELECT DISTINCT client, prenom_nom, no_produit, produit_reçu, date_reçu_client
    FROM INV_CTE
    WHERE RankResult = 1
    ORDER BY client
    le code retourne les produits sauf que il manque des produits, la fonction RANK semble donné une erreur - je sais que n'est pas possible, donc mon code a une erreur, mais je ne trouve pas l'erreur.
    ex: un client a recu 33 produits, mais mon code sort juste 28 produit avec le rank 1. (je peux vérifier son inventaire d'un autre manière, je sais que mon code a une erreur).
    pouvez-vous m'aider ? MERCI

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Débutant
    Inscrit en
    juillet 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : juillet 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut réponse trouvé
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    , RANK() OVER (PARTITION BY ve_livraisons_ln.in_items_id ORDER BY ve_livraisons_ln.date_livr DESC) RankResult
    Pour obtenir le résultat recherché, j'ai oublié qu'il me fallait poser une question supplémentaire / un paramètre supplémentaire dans la fonction RANK:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    , RANK() OVER (PARTITION BY ve_livraisons_ln.in_items_id, client ORDER BY ve_livraisons_ln.date_livr DESC) RankResult
    bonne journée.

Discussions similaires

  1. Trouver les 3 derniers produits de chaque type
    Par guest4541 dans le forum Langage SQL
    Réponses: 17
    Dernier message: 06/09/2016, 10h20
  2. [2008R2] variable texte unique en entrée pour recherche avec mots clés
    Par rikidi dans le forum Développement
    Réponses: 6
    Dernier message: 19/02/2013, 15h40
  3. Réponses: 158
    Dernier message: 24/02/2012, 12h56
  4. Réponses: 0
    Dernier message: 13/06/2009, 15h50
  5. Réponses: 4
    Dernier message: 17/01/2006, 16h53

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