Partage
  • Partager sur Facebook
  • Partager sur Twitter

[HELP] - petit but de code :)

Requête SQL

    11 juin 2020 à 8:25:38

    Bonjour à tous,

    J'essaie de réaliser une petite requête SQL mais je n'y parviens pas, ça ne me paraît pas compliqué en soit mais je ne suis vraiment pas bon en SQL,
    je serai très content que quelqu'un puisse me débouiner sur ce problème. Ça fait une semaine que je patauge là dessus.
     

    Alors voilà, j'ai :
    • 1 table ligne de commande (CDE_LG) dans laquelle on retrouve: les articles achetés ( cde_lg.id_piece), le prix unitaire d'achat (cde_lg.prix) ainsi que l'ID de la commande (cde_lg.devise) et la devise (cde_lg.id_devise)
    • 1 table commande (CDE) dans laquelle on retrouve l'ID de la commande (cde.id_cde) ainsi que la date de signature (cde.date_signat)
    •1 table devise (DEVISE) dont je me sers pour obtenir systématiquement le prix (cde_lg.prix) en euros, (cde_lg.prix/devise.cours)

    Ce que je souhaite, c'est simplement

    1) afficher toutes les lignes de commande de la table cde_lg dont la date de la commande (CDE.date_signat) se situe entre une date de début et une date de fin. Cette partie j'y parviens :

    SELECT 
    cde.DATE_SIGNAT,
    cde.CDE,
    cde_lg.id_cde_lg,
    cde.id_cde,
    cde_lg.REMIS_L,
    (1-(cde_lg.REMIS_L/100))*cde_lg.PRIX/DEVISE.cours AS 'Prix_unitaire_euro'
    FROM cde_lg
    INNER JOIN cde ON cde_lg.ID_CDE = cde.ID_CDE
    INNER JOIN devise ON cde_lg.ID_DEVISE = devise.ID_DEVISE
    WHERE CDE.date_signat>'20200101'

    2) faire ensuite une sous-requête car j'ai besoin à l'issue de la première requête, d'obtenir la prix moyen d'achat des articles affichés: AVG(cde_lg.prix) mais ce prix ne doit pas tenir compte du filtre de la première requête je dois obtenir la moyenne de tous les prix d'achat de l'article concernée.

    PS : un même article (cde_lg.id_piece)peut avoir été acheté plusieurs fois dans différentes commandes (voir même plusieurs fois dans une seule commande). Dans tous les cas, son ID reste le même puisque c'est la même pièce.

     En vous remerciant par avance pour toute l'aide dont vous pourrez m'apporter.

    • Partager sur Facebook
    • Partager sur Twitter
      11 juin 2020 à 9:17:41

      Bonjour,

      En effet, une sous-requête me paraît nécessaire.

      Je te propose ceci :

      SELECT 
      	C.DATE_SIGNAT,
      	C.CDE,
      	C.id_cde_lg,
      	C.id_cde,
      	L.REMIS_L,
      	(1-(L.REMIS_L/100))*L.PRIX/D.cours AS 'Prix_unitaire_euro',
      	M.prix_moyen
      FROM
      	cde_lg L
      		INNER JOIN cde C
      			ON L.ID_CDE = C.ID_CDE
      		INNER JOIN devise D
      			ON L.ID_DEVISE = D.ID_DEVISE
      		INNER JOIN (
      				-- Moyenne des prix par pièce
      				SELECT
      					L.id_piece,
      					AVG( (1-(L.REMIS_L/100))*L.PRIX/D.cours ) AS prix_moyen
      				FROM
      					cde_lg L
      						INNER JOIN devis D
      							ON L.ID_DEVISE = D.ID_DEVISE
      				GROUP BY L.id_piece
      			) M
      			ON L.id_piece = M.id_piece
      WHERE C.date_signat>'20200101'

      Si tu veux pousser un peu en terme de "propreté", tu peux fonctionner avec une vue :

      CREATE VIEW vue_moyenne_prix AS
      	SELECT
      		L.id_piece,
      		AVG( (1-(L.REMIS_L/100))*L.PRIX/D.cours ) AS prix_moyen
      	FROM
      		cde_lg L
      			INNER JOIN devis D
      				ON L.ID_DEVISE = D.ID_DEVISE
      	GROUP BY L.id_piece;

      Une fois cette vue créée, tu peux l'utiliser comme une table "normale" dans tes requêtes. Ma proposition précédente devient donc :

      SELECT 
      	C.DATE_SIGNAT,
      	C.CDE,
      	C.id_cde_lg,
      	C.id_cde,
      	L.REMIS_L,
      	(1-(L.REMIS_L/100))*L.PRIX/D.cours AS 'Prix_unitaire_euro',
      	M.prix_moyen
      FROM
      	cde_lg L
      		INNER JOIN cde C
      			ON L.ID_CDE = C.ID_CDE
      		INNER JOIN devise D
      			ON L.ID_DEVISE = D.ID_DEVISE
      		INNER JOIN vue_moyenne_prix M
      			ON L.id_piece = M.id_piece
      WHERE C.date_signat>'20200101'
      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        11 juin 2020 à 9:38:38

        Bonjour Benzouye,

        j'ai juste modifié (si j'ai bien compris l'esprit de la requête) C.id_cde_lg par L.id_cde_lg et C.id_cde par L.id_cde car j'avais une erreur mais suite à ça, ça fonctionne !!!

        >> Un grand merci ! <<

        Quant à ta proposition n°2, je ne sais pas comment la déployer dans mon code SQL je n'ai jamais écrit plus d'une requête à la fois (tout dans la même requête ?)
        Je vais creuser le sujet car c'est intéressant. Dans l'attente, je te suis très reconnaissant pour ton aide.

        Excellente journée à toi !

        -
        Edité par ThomasS.1 11 juin 2020 à 10:31:20

        • Partager sur Facebook
        • Partager sur Twitter
          11 juin 2020 à 12:18:12

          La vue est à créer directement dans MySQL (tu peux passer par PHPMyAdmin par exemple) en exécutant une seule fois la commande CREATE VIEW.

          Une fois créée, elle est disponible de façon permanente.

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

          [HELP] - petit but de code :)

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown