Partage
  • Partager sur Facebook
  • Partager sur Twitter

[MS SQL] Obtenir la dernière date

    6 février 2017 à 9:45:41

    Bonjour, je suis actuellement en train de travail sur les mouvements de stock de mes différents produits et j'aiemrai sortir un requête qui me permettrait d'avoir uniquement la dernière date de mouvement de stock. Les différentes requêtes que j'ai essayé ne mènent à rien. Voilà celle qui me semble le plus proche de ce que je veux. 

    SELECT * FROM (
        SELECT
            COD_PROD, DATE_MVT, TYPE_MVT,
            RANK() OVER (PARTITION BY COD_PROD
    		 ORDER BY DATE_MVT) RankOrder
        FROM MVTSTOCK
    ) T
    WHERE RankOrder = 1
    ORDER BY DATE_MVT

    Cependant, elle ne me ressort que la première date et non la dernière, une idée de la solution ? 

    • Partager sur Facebook
    • Partager sur Twitter
      6 février 2017 à 10:34:27

      Bonjour,

      ThéoMinhoto a écrit:

      j'aiemrai sortir un requête qui me permettrait d'avoir uniquement la dernière date de mouvement de stock

      Le dernier mouvement par produit je suppose ?

      Je ne connais pas bien les syntaxes SQL Server, mais avec une syntaxe plus universelle tu peux simplement faire :

      SELECT COD_PROD, MAX( DATE_MVT )
      FROM MVTSTOCK
      GROUP BY COD_PROD

      Ensuite si tu veux plus d'information sur le mouvement en question, tu peux utiliser cette requête comme sous-requête pour relier à la table des mouvements selon la date maxi et le code produit. Attention toutefois si un même produit à plusieurs mouvements pour sa date maximale, cela génèrera des doublons, à considérer.

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        6 février 2017 à 11:04:42

        Moi qui cherchais  compliqué... c'est beaucoup plus simple ainsi juste une dernière question, j'essaye de faire uun JOIN vers une autre table mais lorsque je fais celui-ci ma requête prend un temps monstrueux. Et lorsque dans mon SELECT j'ajoute quelque chose j'obtiens un ' Msg 8120, Niveau 16, État 1, Ligne 1
        La colonne 'MVTSTOCK.TYPE_MVT' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY. '

        -
        Edité par ThéoMinhoto 6 février 2017 à 11:12:39

        • Partager sur Facebook
        • Partager sur Twitter
          6 février 2017 à 11:53:22

          Peux-tu poster la requête en question ?

          Peux-tu nous donner une idée des volumes contenu dans les tables en question et des index existants sur ces tables.

          ThéoMinhoto a écrit:

          La colonne 'MVTSTOCK.TYPE_MVT' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY. '

          Si tu rajoutes des colonnes dans le SELECT, alors il faut également les ajouter au GROUP BY, mais attention à ce que tu fais, cela peut modifier grandement le résultat de ta requête ...
          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            6 février 2017 à 13:46:47

            J'ai ça comme requête
            SELECT MVTSTOCK.COD_PROD, MAX( DATE_MVT ), TYPE_MVT
            FROM MVTSTOCK
            JOIN STOCK_DEPOT on STOCK_DEPOT.COD_DEPOT = MVTSTOCK.COD_DEPOT
            WHERE QTE_STOCK != 0
            GROUP BY MVTSTOCK.COD_PROD, TYPE_MVT
            ORDER BY COD_PROD
            

            J'ai rajouté la colonne dans mon GROUPE BY, la requête fonctionne mais maintenant j'ai à la fois une ligne pour les ENTREE et une autre pour les SORTIE  (cela correspond à TYPE_MVT). J'aimerai cependant n'avoir qu'une ligne par produits (COD_PROD).

            Nessky qui est l'un de mes collaborateurs à été posté plusieurs fois ici, la base de données est la même. Elle est généré automatiquement et elle est assez riche en données.

            -
            Edité par ThéoMinhoto 6 février 2017 à 14:03:37

            • Partager sur Facebook
            • Partager sur Twitter
              6 février 2017 à 13:56:48

              C'est le fonctionnement normal de GROUP BY. Cette clause regroupe sur chaque couple donné, ici pour chaque couple produit/type ...

              ThéoMinhoto a écrit:

              J'aimerai cependant n'avoir qu'une ligne par produits (COD_PROD). 

              La requête te donne pour chaque type (entrée ou sortie) et chaque produit la date du dernier mouvement. Si tu veux une seule ligne par produit, il faut retirer le type ...

              Je ne comprends pas ce que tu cherches à obtenir ... Peux-tu nous donner des exemples de données et de résultat attendu ?

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                6 février 2017 à 14:09:25

                Alors en faite par exemple avec la requête suivante : 

                SELECT MVTSTOCK.COD_PROD, MAX( DATE_MVT ), TYPE_MVT
                FROM MVTSTOCK
                JOIN STOCK_DEPOT on STOCK_DEPOT.COD_DEPOT = MVTSTOCK.COD_DEPOT
                WHERE QTE_STOCK != 0
                GROUP BY MVTSTOCK.COD_PROD, TYPE_MVT
                ORDER BY COD_PROD
                
                
                

                J'obtiens ce résultat :

                 

                Pour le produit : 3CO-3C17262 j'ai deux lignes différentes, cependant j'aimerai n'avoir que celle avec la  date la plus récente (ici le 24 Mars 2010) mais j'aimerai aussi gardé le type de mouvement. 

                 

                • Partager sur Facebook
                • Partager sur Twitter
                  6 février 2017 à 14:40:57

                  Benzouye avait écrit plus haut :

                  si tu veux plus d'information sur le dernier mouvement trouvé, tu peux utiliser cette requête comme sous-requête pour relier à la table des mouvements selon la date maxi et le code produit.

                  Il te faut bien fonctionner avec une sous-requête. D'abord tu calcules la date du dernier mouvement par produit, puis tu utilises ce résultat dans une autre requête pour récupérer les infos du mouvement en question :

                  SELECT
                  	M.COD_PROD,
                  	M.DATE_MVT,
                  	M.TYPE_MVT
                  FROM
                  	(
                  		-- Date du dernier mouvement par produit
                  		SELECT COD_PROD, MAX( DATE_MVT ) AS date_max
                  		FROM MVTSTOCK M
                  		GROUP BY COD_PROD
                  	) DM
                  		INNER JOIN MVTSTOCK M
                  			ON DM.COD_PROD = M.COD_PROD
                  			AND DM.date_max = M.DATE_MVT
                  ORDER BY M.COD_PROD;

                  Après je n'ai pas remis ta condition avec STOCK_DEPOT, mais je la trouvait bizarre ...

                  Si tu veux bien m'expliquer ta structure de base de données ;)

                  -
                  Edité par Benzouye 6 février 2017 à 14:42:13

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    6 février 2017 à 14:58:02

                    Merci, ça à l'air de marcher cependant j'ai vraiment besoin de la condition 
                    WHERE QTE_STOCK != 0

                    Elle me permet de n'afficher que les produits qui sont présent dans notre stock.

                    Et pour la base de données je vais faire concis : Elle est généré par Atheneo un ERP édité par MISMO. Cependant, ce dernier n'a fait aucune jointure entre les différentes tables et ces dernières sont extrêmement fournis en colonnes (ce qui donne une liste de redondance énorme).

                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 février 2017 à 16:18:35

                      ThéoMinhoto a écrit:

                      afficher que les produits qui sont présent dans notre stock

                      J'avais bien compris, mais ...

                      Si tu fais une jointure sur le COD_DEPOT pour aller chercher la colonne QTE_STOCK, rien ne te dit que cette quantité concerne le produit en question. Je pense qu'il faut faire la jointure avec DEPOT et PROD.

                      SELECT
                      	M.COD_PROD,
                      	M.DATE_MVT,
                      	M.TYPE_MVT
                      FROM
                      	(
                      		-- Date du dernier mouvement par produit
                      		SELECT COD_PROD, MAX( DATE_MVT ) AS date_max
                      		FROM MVTSTOCK M
                      		GROUP BY COD_PROD
                      	) DM
                      		INNER JOIN MVTSTOCK M
                      			ON DM.COD_PROD = M.COD_PROD
                      			AND DM.date_max = M.DATE_MVT
                      		INNER JOIN STOCK_DEPOT SD
                      			ON M.COD_DEPOT = SD.COD_DEPOT
                      			AND M.COD_PROD = SD.COD_PROD
                      WHERE SD.QTE_STOCK != 0
                      ORDER BY M.COD_PROD;

                      Mais si tu fais cela, tu prends le risque d'avoir un même produit stocké sur plusieurs dépôts, donc la jointure va te retourner plusieurs lignes ... une par dépôt ...

                      Du coup il faudrait peut-être calculer le stock tout dépôt confondu par produit ... à voir ...

                      -
                      Edité par Benzouye 6 février 2017 à 16:19:15

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        7 février 2017 à 10:13:39

                        Je n'ai qu'un seul dépôt donc ce n'est pas un soucis, maintenant j'ai un autre problème. Avec cette requête : 

                        SELECT
                            M.COD_PROD,
                            M.DATE_MVT,
                            M.TYPE_MVT
                        FROM
                            (
                                SELECT M.COD_PROD, MAX( DATE_MVT ) AS date_max
                                FROM MVTSTOCK M
                        		JOIN STOCK_DEPOT 
                        			ON STOCK_DEPOT.NO_PRODUIT = M.NO_PRODUIT
                        		WHERE QTE_STOCK != 0
                                GROUP BY M.COD_PROD
                            ) DM
                                INNER JOIN MVTSTOCK M
                                    ON DM.COD_PROD = M.COD_PROD
                                    AND DM.date_max = M.DATE_MVT
                        ORDER BY M.COD_PROD;

                        J'ai parfois des ENTREE et des SORTIE qui sont faite au même moment et du coup elle me ressort 2 lignes, ce qui est assez embêtant.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          7 février 2017 à 11:34:36

                          Benzouye avait écrit:

                          Attention toutefois si un même produit à plusieurs mouvements pour sa date maximale, cela générera des doublons, à considérer.

                          Hélas tu étais prévenu :p

                          Pourtant avec des colonnes DATETIME hh:mm:ss c'est quand même super rare ... mais ça arrive ...

                          Du coup il te faut décider comment réagir dans ce cas ... Lequel des deux mouvements prime sur l'autre ? L'entrée ou la sortie ?

                          Après un mouvement de stock n'est-il pas identifié par un id incrémenté qui pourrait te donner l'ordre de création ?

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                            26 mars 2024 à 15:50:30

                            Hello !

                            J'ai pu utiliser la trame de la requête + sous requête et vous m'avez sauvée !!! 

                            J'ai eu le même genre de problématique : il me fallait avoir mon stock âgé. Je n'arrivais à n'avoir que la date max....

                            Bref après de multiples recherches, je suis tombée sur votre post et j'ai compris le concept de la sous-requête !!!

                            Grace à vous j'ai établir mon fichier avec de multiples jointures !! Il ne me reste qu'un ou deux doublons du fait de la nature des mouvements que j'ai également voulu faire apparaître.

                            Merci !!!

                            • Partager sur Facebook
                            • Partager sur Twitter

                            [MS SQL] Obtenir la dernière date

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            • Editeur
                            • Markdown