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

WinDev Discussion :

Requête avec des calculs sur plusieurs fichiers de données [WD24]


Sujet :

WinDev

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 121
    Points : 53
    Points
    53
    Par défaut Requête avec des calculs sur plusieurs fichiers de données
    Bonjour à toutes et à tous,

    Lorsque je bloque sur un truc, je me documente, je lis, je cherche (dès fois pas très bien) et puis je fais autre chose, je reviens dessus et quand je crois avoir tout tenté et que rien n'y fait, je viens chercher de l'aide pour essayer de faire ce que je cherche à obtenir.

    Avant de développer j'ai hésiter à poster sur le forum SQL par rapport au langage mais voilà il s'agit de Windev.

    Pour vous expliquer le plus simplement possible voici une petite image. Moi-même je me comprends mieux avec des images.

    Nom : capture d’écran.png
Affichages : 861
Taille : 21,4 Ko

    Dans les colonnes de "Code à Quantité Vendu", j'arrive à afficher les données par une requête sur les fichiers de données VENTE_LIGNE, PRODUIT... de mon analyse https://www.developpez.net/forums/at.../analyse1.jpg/.

    Dans un autre post https://www.developpez.net/forums/d2.../#post11589366 j'envisage de regrouper les fichier de données RECEPTION_LIGNE, VENTE_LIGNE et TRANSFERT_LIGNE dans un seul fichier MOUVEMENT (ce qui me semble-t-il aurai été plus simple pour construire cette requête). Mais pour l'instant, j'ai pas encore fini de réfléchir à la structure des données.
    Donc ce que je voudrais obtenir c'est le remplissage des colonnes "Dispo..." par la somme des RECEPTION_LIGNE-VENTE_LIGNE+TRANSFERT_LIGNE(Quantité_entrante)-TRANSFERT_LIGNE(Quantité_sortante).

    Voilà ce que j'ai déjà fait. Jusqu'à présent je passais par l'éditeur de requête, mais en codant directement en SQL je n'arrivais pas toujours au résultat. Et puis j'ai lu deux, trois de vos conseils ou il est conseillé de pas utilisé l'éditeur.
    Alors j'ai essayé de me mettre à la saisie dans la fenêtre. Je dois avouer que c'est pas mal.
    Du coup dans la déclaration globale de la fenêtre j'ai écris:
    Code windev : 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
     
    sReqVente est une chaîne
     
    //La requete ci-dessous affiche les ventes et la sommes des quantités vendues
    sReqVente = [
    	SELECT 
    	VENTE_LIGNE_2020.IDproduit AS Code,
    	PRODUIT.produit_ref_produit AS Reference,
    	PRODUIT.produit_nom_produit AS Designation,
    	PRODUIT_COULEUR.Couleur_Nom AS Couleur,
    	FOURNISSEUR.Nom_fournisseur AS Fournisseur,
    	SUM(VENTE_LIGNE_2020.Panier_Ligne_Quantite) AS Quantite
     
    FROM 
    	VENTE_LIGNE_2020
    	left outer join PRODUIT ON VENTE_LIGNE_2020.IDproduit = PRODUIT.IDproduit
    	left outer join PRODUIT_COULEUR ON PRODUIT_COULEUR.IDcouleur = PRODUIT.IDcouleur
    	left outer join FOURNISSEUR ON FOURNISSEUR.IDfournisseur = PRODUIT.IDfournisseur
     
    GROUP BY
    	VENTE_LIGNE_2020.IDproduit,
    	PRODUIT.produit_ref_produit,
    	PRODUIT.produit_nom_produit,
    	PRODUIT_COULEUR.Couleur_Nom,
    	FOURNISSEUR.Nom_fournisseur
    ]
     
    sdMaRequeteVente est une Source de Données
     
    SI PAS HExécuteRequêteSQL(sdMaRequeteVente, sReqVente) ALORS
    	Erreur(ErreurInfo(errComplet))
     
    SINON
     
    	POUR TOUT sdMaRequeteVente 
     
    		TableAjouteLigne(TABLE_SansNom1, "", sdMaRequeteVente.Code, sdMaRequeteVente.Reference,...
    		sdMaRequeteVente.Designation, sdMaRequeteVente.Couleur, sdMaRequeteVente.Fournisseur, sdMaRequeteVente.Quantite)
     
    	FIN
    FIN

    J'ai essayé des trucs mais sans résultat et notamment ce qui me paraissait le plus logique en rajoutant les lignes 10 à 34
    Code SQL : 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
     
    sReqVente = [
    	SELECT 
    	VENTE_LIGNE_2020.IDproduit AS Code,
    	PRODUIT.produit_ref_produit AS Reference,
    	PRODUIT.produit_nom_produit AS Designation,
    	PRODUIT_COULEUR.Couleur_Nom AS Couleur,
    	FOURNISSEUR.Nom_fournisseur AS Fournisseur,
    	SUM(VENTE_LIGNE_2020.Panier_Ligne_Quantite) AS Quantite,
     
    (SELECT RECEPTION_LIGNE.reception_ligne_quantite AS Quant_A1
    FROM RECEPTION_LIGNE
    LEFT OUTER JOIN RECEPTION ON RECEPTION.IDreception = RECEPTION_LIGNE.IDreception
    WHERE RECEPTION.IDmagasin = 1),
    (SELECT RECEPTION_LIGNE.reception_ligne_quantite AS Quant_A2
    FROM RECEPTION_LIGNE
    LEFT OUTER JOIN RECEPTION ON RECEPTION.IDreception = RECEPTION_LIGNE.IDreception
    WHERE RECEPTION.IDmagasin = 2),
    (SELECT RECEPTION_LIGNE.reception_ligne_quantite AS Quant_L1
    FROM RECEPTION_LIGNE
    LEFT OUTER JOIN RECEPTION ON RECEPTION.IDreception = RECEPTION_LIGNE.IDreception
    WHERE RECEPTION.IDmagasin = 3),
    (SELECT RECEPTION_LIGNE.reception_ligne_quantite AS Quant_S1
    FROM RECEPTION_LIGNE
    LEFT OUTER JOIN RECEPTION ON RECEPTION.IDreception = RECEPTION_LIGNE.IDreception
    WHERE RECEPTION.IDmagasin = 4),
    (SELECT RECEPTION_LIGNE.reception_ligne_quantite AS Quant_S2
    FROM RECEPTION_LIGNE
    LEFT OUTER JOIN RECEPTION ON RECEPTION.IDreception = RECEPTION_LIGNE.IDreception
    WHERE RECEPTION.IDmagasin = 5),
    (SELECT RECEPTION_LIGNE.reception_ligne_quantite AS Quant_M1
    FROM RECEPTION_LIGNE
    LEFT OUTER JOIN RECEPTION ON RECEPTION.IDreception = RECEPTION_LIGNE.IDreception
    WHERE RECEPTION.IDmagasin = 6)
     
    FROM 
    	VENTE_LIGNE_2020
    	left outer join PRODUIT ON VENTE_LIGNE_2020.IDproduit = PRODUIT.IDproduit
    	left outer join PRODUIT_COULEUR ON PRODUIT_COULEUR.IDcouleur = PRODUIT.IDcouleur
    	left outer join FOURNISSEUR ON FOURNISSEUR.IDfournisseur = PRODUIT.IDfournisseur
     
    GROUP BY
    	VENTE_LIGNE_2020.IDproduit,
    	PRODUIT.produit_ref_produit,
    	PRODUIT.produit_nom_produit,
    	PRODUIT_COULEUR.Couleur_Nom,
    	FOURNISSEUR.Nom_fournisseur
     
    ]

    Testée individuellement chacune des requêtes affiche le résultat. Ce que je n'ai réussi à faire c'est combiner les deux.

    Merci pour vos conseils.

    Bien à vous.

    Grégus

    [EDIT] Petite précision, lorsque j'ai testé la requête ci-dessus, dans "TableAjouteLigne" j'avais ajouté sdMaRequeteVente.Quant_A1, sdMaRequeteVente.Quant_A2... [/EDIT]

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 055
    Points : 9 394
    Points
    9 394
    Par défaut
    Ta première requête a l'air correcte.
    Elle te donne des résultats cohérents ?

    Ta 2ème requête est très compliquée.
    Si je résume, tu fais :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ..., (select  .... from ... ) 
    FROM
    ...

    J'ai déjà vu des requêtes aties comme ça, il y en a qui ont essayé, ils ont eu des résultats.

    Des requêtes, j'en ai fait quelques milliers dans ma vie, et je crois que je n'en ai jamais fait de ce type. Et je ne suis pas sûr du tout que HFSQL accepte cette mécanique.

    Peux-tu expliquer ce que tu veux obtenir (en français, pas en SQL), et on verra comment s'en sortir.
    Dans un premier temps, parlons uniquement de ce que tu appelles QUANT_A1.
    Quand on saura traiter QUANT_A1, on devrait savoir faire les autres colonnes.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2019
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2019
    Messages : 16
    Points : 29
    Points
    29
    Par défaut
    La 1ere syntaxe est plutôt bien.
    QU'est ce qu'il ne va pas ?


    La seconde syntaxe est a proscrire.

    NB : ne changez pas votre modèle de donnée a cause d'une requête complexe à écrire. Restez toujours normalisé.

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 121
    Points : 53
    Points
    53
    Par défaut
    Bonjour tbc92,
    Bonjour à toutes et à tous,

    Merci pour ton intérêt à ma recherche d'aide pour réaliser l'affichage que je souhaite obtenir.


    Citation Envoyé par tbc92 Voir le message
    Ta première requête a l'air correcte.
    Elle te donne des résultats cohérents ?
    Oui tout à fait, elle correspond au données qui s'affiche dans le champs table que j'avais mis en pièce jointe dans mon premier message


    Citation Envoyé par tbc92 Voir le message
    Ta 2ème requête est très compliquée.
    Si je résume, tu fais :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ..., (select  .... from ... ) 
    FROM
    ...
    Je te l'accorde et en plus elle ne fonctionne pas (sauf si j'ai fait une erreur dans le code).
    En revanche si je fais une requête seulement sur
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT RECEPTION_LIGNE.reception_ligne_quantite AS Quant_A1
    FROM RECEPTION_LIGNE
    LEFT OUTER JOIN RECEPTION ON RECEPTION.IDreception = RECEPTION_LIGNE.IDreception
    WHERE RECEPTION.IDmagasin = 1
    J'avais commencé à écrire que j'obtenais un résultat cohérent. Et puis par acquis de conscience j'ai préféré vérifié avant et en fait je n'arrive pas obtenir ce que je souhaite.


    Citation Envoyé par tbc92 Voir le message
    Peux-tu expliquer ce que tu veux obtenir (en français, pas en SQL), et on verra comment s'en sortir.
    Dans un premier temps, parlons uniquement de ce que tu appelles QUANT_A1.
    Quand on saura traiter QUANT_A1, on devrait savoir faire les autres colonnes.
    D'accord, je vais essayer de faire simple. Une image commentée...
    Nom : capture d’écran_2.jpg
Affichages : 801
Taille : 81,8 Ko

    Dans le champ table ci-dessus, je voudrais (ce qui est déjà le cas) afficher les codes des produits vendus, avec des infos correspondantes à ces produits, la quantité des articles vendus et la quantité restante (que je n'ai pas encore réussi à faire) en stock pour chaque succursale au moment de l’exécution de la requête.

    Le code qui me permet d'obtenir l'affichage actuel
    Code SQl : 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
     
    SELECT 
    	VENTE_LIGNE_2020.IDproduit AS Code,
    	PRODUIT.produit_ref_produit AS Reference,
    	PRODUIT.produit_nom_produit AS Designation,
    	PRODUIT_COULEUR.Couleur_Nom AS Couleur,
    	FOURNISSEUR.Nom_fournisseur AS Fournisseur,
    	SUM(VENTE_LIGNE_2020.Panier_Ligne_Quantite) AS Quantite
     
    FROM 
    	VENTE_LIGNE_2020
    	left outer join PRODUIT ON VENTE_LIGNE_2020.IDproduit = PRODUIT.IDproduit
    	left outer join PRODUIT_COULEUR ON PRODUIT_COULEUR.IDcouleur = PRODUIT.IDcouleur
    	left outer join FOURNISSEUR ON FOURNISSEUR.IDfournisseur = PRODUIT.IDfournisseur
     
    GROUP BY
    	VENTE_LIGNE_2020.IDproduit,
    	PRODUIT.produit_ref_produit,
    	PRODUIT.produit_nom_produit,
    	PRODUIT_COULEUR.Couleur_Nom,
    	FOURNISSEUR.Nom_fournisseur

    Je teste depuis ce matin indépendamment la partie "Quant_A1" mais c'est pas toujours cohérent.

    Je pose le problème.
    Pour chaque IDproduit vendu je voudrais pouvoir connaitre la quantité qu'il reste dans chaque succursale.

    J'ai essayé de défaire les nœuds mais pour l'instant sans succès.

    A vous lire. Merci

    Grégus

  5. #5
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 46
    Points : 59
    Points
    59
    Par défaut
    Ah, ok
    Essaye donc de passer par des sous requêtes :

    Code SQL : 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
    Select 
        Succursale.nom,
        cumul_a.total_a,
        cumul_b.total_b,
        cumul_c.total_c
     
    from Succursale
     
        left outer join (
     
            SELECT
                Sucursale_ID,
                SUM(Vtes) AS total_a
            from ventes
            group by Sucursale_ID
     
        ) AS cumul_a ON (cumul_a.ID = Succursale.ID)
     
     
        left outer join (
     
            SELECT
                Sucursale_ID,
                SUM(Vtes) AS total_b
            from achats
            group by Sucursale_ID
     
        ) AS cumul_b ON (cumul_b.ID = Succursale.ID)
     
     
        left outer join (
     
            SELECT
                Sucursale_ID,
                SUM(Vtes) AS total_c
            from Stock
            group by Sucursale_ID
     
        ) AS cumul_c ON (cumul_c.ID = Succursale.ID)

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 121
    Points : 53
    Points
    53
    Par défaut
    Bonjour ben34fr,

    Citation Envoyé par ben34fr Voir le message
    La 1ere syntaxe est plutôt bien.
    QU'est ce qu'il ne va pas ?


    La seconde syntaxe est a proscrire.

    NB : ne changez pas votre modèle de donnée a cause d'une requête complexe à écrire. Restez toujours normalisé.
    La première syntaxe fonctionne et donne le résultat souhaité.

    La deuxième syntaxe c'est ce que j'ai testé mais qui ne fonctionne pas.

    N'étant pas professionnel je découvre au fur et à mesure de mes essaie. Du coup je suis beaucoup dans l'hésitation quand aux changement de modèle de donnée. Je ne suis pas certain d'avoir fait les bon choix au départ.

    Citation Envoyé par ben34fr Voir le message
    QU'est ce qu'il ne va pas ?
    En fait, dans la même requête je n'arrive pas (en même temps c'est peut-être pas possible) à avoir la liste des articles vendus et les quantités restantes des articles vendus pour chacune des succursales.

    [EDIT] Pas vu le message précédent, je regarde et j'essaie [/EDIT]

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 121
    Points : 53
    Points
    53
    Par défaut
    tbc92 me demandait si les résultats étaient cohérents.
    J'ai répondu "oui". Sur les conseils qui me sont parvenus et la relecture de quelques posts évoquant les sous requêtes, j'ai imbriqué des calculs à ma première requête et la des incohérences dans les résultats.

    J'ai réfléchi à la "cohérence" et comme cela me faisait faire trop de vérification, j'ai songé qu'en partant de la table PRODUIT et des "IDproduit" comme j'en connais le nombre il y a là une cohérence simplissime. J'ai 23173 IDproduit, je dois avoir à l'affichage dans mon champ table 23173 lignes.
    Je trouvais que c'était une première bonne cohérence.
    Du coup j'ai décidé de reprendre ma requête pour partir du fichier de données PRODUIT et des IDproduit et de faire des sous requêtes à partir des ID produit. Et la, lorsque j'ai fait le premier calcul il y a une première incohérence. J'ai à l'affichage 23317 lignes. Voilà ce que j'écris
    Code SQL : 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
     
    SELECT
    PRODUIT.IDproduit AS Code,
    PRODUIT.produit_ref_produit AS Reference,
    PRODUIT.produit_nom_produit AS Designation,
    PRODUIT_COULEUR.Couleur_Nom AS Couleur,
    FOURNISSEUR.Nom_fournisseur AS Fournisseur,
    SUM(VENTE_LIGNE_2020.Panier_Ligne_Quantite) AS Quantite
     
     
    FROM
    PRODUIT
    LEFT JOIN PRODUIT_COULEUR ON PRODUIT.IDcouleur = PRODUIT_COULEUR.IDcouleur
    LEFT JOIN FOURNISSEUR ON PRODUIT.IDfournisseur = FOURNISSEUR.IDfournisseur
    LEFT JOIN VENTE_LIGNE_2020 ON PRODUIT.IDproduit = VENTE_LIGNE_2020.IDproduit
     
    GROUP BY
    PRODUIT.IDproduit,
    PRODUIT.produit_ref_produit,
    PRODUIT.produit_nom_produit,
    PRODUIT_COULEUR.Couleur_Nom,
    FOURNISSEUR.Nom_fournisseur,
    VENTE_LIGNE_2020.Panier_Ligne_Quantite
    J'ai cherché d'où pouvait venir l'anomalie et je me suis rendu compte que le SUM ne soustrait pas les quantités qui sont en négatif.
    Code Référence Désignation Quantité
    15951 **** **** -1
    15951 **** **** 1

    Qu'est-ce que j'ai mal fait?

  8. #8
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 384
    Points : 9 745
    Points
    9 745
    Par défaut
    Bonjour,

    Dans ta 2ème requête de ton premier post, tu devrais mettre les "as Quant" en dehors du SELECT.
    J'essaierais cela
    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
     
     
    sReqVente = [
    	SELECT 
    	VENTE_LIGNE_2020.IDproduit AS Code,
    	PRODUIT.produit_ref_produit AS Reference,
    	PRODUIT.produit_nom_produit AS Designation,
    	PRODUIT_COULEUR.Couleur_Nom AS Couleur,
    	FOURNISSEUR.Nom_fournisseur AS Fournisseur,
    	SUM(VENTE_LIGNE_2020.Panier_Ligne_Quantite) AS Quantite,
     
    (SELECT RECEPTION_LIGNE.reception_ligne_quantite 
    FROM RECEPTION_LIGNE
    LEFT OUTER JOIN RECEPTION ON RECEPTION.IDreception = RECEPTION_LIGNE.IDreception
    WHERE RECEPTION.IDmagasin = 1) AS Quant_A1,
    (SELECT RECEPTION_LIGNE.reception_ligne_quantite 
    FROM RECEPTION_LIGNE
    LEFT OUTER JOIN RECEPTION ON RECEPTION.IDreception = RECEPTION_LIGNE.IDreception
    WHERE RECEPTION.IDmagasin = 2) AS Quant_A2,
    (SELECT RECEPTION_LIGNE.reception_ligne_quantite AS Quant_L1
    FROM RECEPTION_LIGNE
    LEFT OUTER JOIN RECEPTION ON RECEPTION.IDreception = RECEPTION_LIGNE.IDreception
    WHERE RECEPTION.IDmagasin = 3) AS Quant_L1,
    (SELECT RECEPTION_LIGNE.reception_ligne_quantite AS Quant_S1
    FROM RECEPTION_LIGNE
    LEFT OUTER JOIN RECEPTION ON RECEPTION.IDreception = RECEPTION_LIGNE.IDreception
    WHERE RECEPTION.IDmagasin = 4) AS Quant_S1,
    (SELECT RECEPTION_LIGNE.reception_ligne_quantite AS Quant_S2
    FROM RECEPTION_LIGNE
    LEFT OUTER JOIN RECEPTION ON RECEPTION.IDreception = RECEPTION_LIGNE.IDreception
    WHERE RECEPTION.IDmagasin = 5) AS Quant_S2,
    (SELECT RECEPTION_LIGNE.reception_ligne_quantite AS Quant_M1
    FROM RECEPTION_LIGNE
    LEFT OUTER JOIN RECEPTION ON RECEPTION.IDreception = RECEPTION_LIGNE.IDreception
    WHERE RECEPTION.IDmagasin = 6) AS Quant_M1
     
    FROM 
    	VENTE_LIGNE_2020
    	left outer join PRODUIT ON VENTE_LIGNE_2020.IDproduit = PRODUIT.IDproduit
    	left outer join PRODUIT_COULEUR ON PRODUIT_COULEUR.IDcouleur = PRODUIT.IDcouleur
    	left outer join FOURNISSEUR ON FOURNISSEUR.IDfournisseur = PRODUIT.IDfournisseur
     
    GROUP BY
    	VENTE_LIGNE_2020.IDproduit,
    	PRODUIT.produit_ref_produit,
    	PRODUIT.produit_nom_produit,
    	PRODUIT_COULEUR.Couleur_Nom,
    	FOURNISSEUR.Nom_fournisseur
     
    ]
    C'est sans aucune garantie.
    JS
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 121
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par Jon Shannow Voir le message
    Bonjour,

    Dans ta 2ème requête de ton premier post, tu devrais mettre les "as Quant" en dehors du SELECT.
    Bonjour JS,

    J'ai essayé
    Code SQL : 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
     
    SELECT 
    	VENTE_LIGNE_2020.IDproduit AS Code,
    	PRODUIT.produit_ref_produit AS Reference,
    	PRODUIT.produit_nom_produit AS Designation,
    	PRODUIT_COULEUR.Couleur_Nom AS Couleur,
    	FOURNISSEUR.Nom_fournisseur AS Fournisseur,
    	SUM(VENTE_LIGNE_2020.Panier_Ligne_Quantite) AS Quantite,
    	(SELECT RECEPTION_LIGNE.reception_ligne_quantite 
    		FROM RECEPTION_LIGNE
    		LEFT OUTER JOIN RECEPTION ON RECEPTION.IDreception = RECEPTION_LIGNE.IDreception
    		WHERE RECEPTION.IDmagasin = 1) AS Quant_A1
     
    FROM 
    	VENTE_LIGNE_2020
    	left outer join PRODUIT ON VENTE_LIGNE_2020.IDproduit = PRODUIT.IDproduit
    	left outer join PRODUIT_COULEUR ON PRODUIT_COULEUR.IDcouleur = PRODUIT.IDcouleur
    	left outer join FOURNISSEUR ON FOURNISSEUR.IDfournisseur = PRODUIT.IDfournisseur
     
    GROUP BY
    	VENTE_LIGNE_2020.IDproduit,
    	PRODUIT.produit_ref_produit,
    	PRODUIT.produit_nom_produit,
    	PRODUIT_COULEUR.Couleur_Nom,
    	FOURNISSEUR.Nom_fournisseur,
    	RECEPTION_LIGNE.reception_ligne_quantite

    Mais j'ai une erreur "Le fichier RECEPTION_LIGNE n'existe pas dans la clause FROM"

  10. #10
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 055
    Points : 9 394
    Points
    9 394
    Par défaut
    Je pense que cette requête devrait convenir :

    Code SQL : 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
     
    select 
     A.Code,  A.Reference, a.designation, a.couleur, a.fournisseur, a.quantite ,
     sum ( case when b.IdMagasin = 1 then  b.reception_ligne_quantite else null end ) as Quant1,
     sum ( case when b.IdMagasin = 2 then  b.reception_ligne_quantite else null end ) as Quant2
     
     from
     (
     SELECT 
    	V.IDproduit AS Code,
    	P.produit_ref_produit AS Reference,
    	P.produit_nom_produit AS Designation,
    	PC.Couleur_Nom AS Couleur,
    	F.Nom_fournisseur AS Fournisseur,
    	SUM(V.Panier_Ligne_Quantite) AS Quantite
     
     FROM 
    	VENTE_LIGNE_2020 V
    	left outer join PRODUIT P ON V.IDproduit = P.IDproduit
    	left outer join PRODUIT_COULEUR PC ON PC.IDcouleur = P.IDcouleur
    	left outer join FOURNISSEUR F ON F.IDfournisseur = P.IDfournisseur
     
     GROUP BY
    	V.IDproduit,
    	P.produit_ref_produit,
    	P.produit_nom_produit,
    	PC.Couleur_Nom,
    	F.Nom_fournisseur
     ) a,
     ( 
     SELECT R.Idproduit , R.IDmagasin ,  RL.reception_ligne_quantite  
     FROM RECEPTION_LIGNE  RL 
     LEFT OUTER JOIN RECEPTION R ON R.IDreception = RL.IDreception
     ) b
     where b.idProduit (+)= a.Code

    On est bien d'accord, il y a une colonne idProduit dans le fichier RECEPTION ?

    Pour l'écriture dans une table, il y a la commande ConstruitTableFichier (), ou encore la commande SQLTable().
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 121
    Points : 53
    Points
    53
    Par défaut
    Bonjour tbc92,

    Je n'ai pas encore testé ta proposition, je commence par en étudié la construction pour comprendre ce que tu proposes comme solution et que ce soit constructif pour moi.


    Pour répondre à ta question
    Citation Envoyé par tbc92 Voir le message
    On est bien d'accord, il y a une colonne idProduit dans le fichier RECEPTION ?
    Non pas du tout, IDproduit est dans RECEPTION_LIGNE. Et RECEPTION_LIGNE est lié à RECEPTION par IDreception.

    Un lien vers mon analyse

    Merci

    [EDIT] Ce que je déduis d'une première lecture, c'est que tu as construit une première requête qui appelle (je sais pas comment on dit) des valeurs d'une autre requete "a" construite elle dans le FROM et encore une autre "b". J'avais déjà lu qu'une sous-requête se construit dans le FROM, mais c'est la première fois que j'ai besoin d'utiliser une telle requête. [/EDIT]

  12. #12
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 384
    Points : 9 745
    Points
    9 745
    Par défaut
    Citation Envoyé par Gregus Voir le message
    Bonjour JS,

    J'ai essayé
    Code SQL : 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
     
    SELECT 
    	VENTE_LIGNE_2020.IDproduit AS Code,
    	PRODUIT.produit_ref_produit AS Reference,
    	PRODUIT.produit_nom_produit AS Designation,
    	PRODUIT_COULEUR.Couleur_Nom AS Couleur,
    	FOURNISSEUR.Nom_fournisseur AS Fournisseur,
    	SUM(VENTE_LIGNE_2020.Panier_Ligne_Quantite) AS Quantite,
    	(SELECT RECEPTION_LIGNE.reception_ligne_quantite 
    		FROM RECEPTION_LIGNE
    		LEFT OUTER JOIN RECEPTION ON RECEPTION.IDreception = RECEPTION_LIGNE.IDreception
    		WHERE RECEPTION.IDmagasin = 1) AS Quant_A1
     
    FROM 
    	VENTE_LIGNE_2020
    	left outer join PRODUIT ON VENTE_LIGNE_2020.IDproduit = PRODUIT.IDproduit
    	left outer join PRODUIT_COULEUR ON PRODUIT_COULEUR.IDcouleur = PRODUIT.IDcouleur
    	left outer join FOURNISSEUR ON FOURNISSEUR.IDfournisseur = PRODUIT.IDfournisseur
     
    GROUP BY
    	VENTE_LIGNE_2020.IDproduit,
    	PRODUIT.produit_ref_produit,
    	PRODUIT.produit_nom_produit,
    	PRODUIT_COULEUR.Couleur_Nom,
    	FOURNISSEUR.Nom_fournisseur,
    	RECEPTION_LIGNE.reception_ligne_quantite

    Mais j'ai une erreur "Le fichier RECEPTION_LIGNE n'existe pas dans la clause FROM"
    Il faut que tu remplaces, dans le GROUP BY, la ligne RECEPTION_LIGNE.reception_ligne_quantité par "Quant_A1" qui est l'alias donné au résultat du sous-select.
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 121
    Points : 53
    Points
    53
    Par défaut
    @tbc92

    Après décorticage pour essayer de comprendre j'ai modifié
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     ( 
     SELECT R.Idproduit , R.IDmagasin ,  RL.reception_ligne_quantite  
     FROM RECEPTION_LIGNE  RL 
     LEFT OUTER JOIN RECEPTION R ON R.IDreception = RL.IDreception
     ) b
     where b.idProduit (+)= a.Code
    En
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ( 
     SELECT RL.Idproduit , R.IDmagasin ,  RL.reception_ligne_quantite  
     FROM RECEPTION_LIGNE  RL 
     LEFT OUTER JOIN RECEPTION R ON R.IDreception = RL.IDreception 
     ) b
    Puisque IDproduit est dans RECEPTION_LIGNE


    Après le premier essai j'ai rajouté
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    GROUP BY
     A.Code,
     A.Reference,
     a.designation,
     a.couleur,
     a.fournisseur,
     a.quantite,
     b.reception_ligne_quantite
    A la fin parce qu'il avait un message d'erreur sur les fonctions agrégats

    Et enfin un affichage dans un champ table comme je voudrais l'avoir.
    Je contrôle la cohérence des données et constate une anomalie
    Nom : capture d’écran 2 - essai.png
Affichages : 731
Taille : 44,0 Ko
    Les produits se répètent.

    Je cherche à comprendre. Je réfléchis.
    Je compare les données. J'en profite pour adresser à tbc92 un grand merci
    Citation Envoyé par tbc92 Voir le message
    Pour l'écriture dans une table, il y a la commande ConstruitTableFichier (), ou encore la commande SQLTable().
    J'ai découvert comment afficher directement le résultat d'une requête en mode test, et pas que. Cependant j'ai une petite question dans ce cas la "Mise à blanc si zéro" dans l'IHM est inefficace. Est-ce qu'il y a une autre solution?

    Du coup j'ai décomposé la requête que m'avait proposé tbc92 pour voir le résultat individuellement. La requête principale "a" sur les quelques sondages de données que j'ai effectué ne présente pas d'anomalie.

    En revanche, lorsque je teste individuellement
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT RL.Idproduit , R.IDmagasin , SUM(RL.reception_ligne_quantite) Quant_Receipt
     FROM RECEPTION_LIGNE  RL 
     INNER JOIN RECEPTION R ON R.IDreception = RL.IDreception
     
     GROUP BY
     RL.Idproduit,
     R.IDmagasin,
     RL.reception_ligne_quantite
    les lignes se reproduisent autant de fois qu'il y a eu de reception
    Comme si la SUM ou le GROUP BY ne se faisait pas ???

  14. #14
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 121
    Points : 53
    Points
    53
    Par défaut
    Je crois que j'ai trouvé, en regardant un autre sujet sur le forum.

    En regardant la requête du sujet qui utilise un SUM, je constate que les données de ce dernier ne sont pas dans le GROUP BY, je viens de faire un premier test avec la partie RECEPTION_LIGNE et à priori les données s'additionnent.

    Je contrôle tout ça et je reviens vous dire

  15. #15
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 121
    Points : 53
    Points
    53
    Par défaut
    Ils devraient l'écrire plus gros.

    TOUTES LES RUBRIQUES OU FONCTIONS NON AGRÉGAT DOIVENT FIGURER DANS LA CLAUSE GROUP BY.

    Ça veux dire "PAS CELLE QUI SONT AGRÉGATS".

    Déjà qu'il faut que ça monte au cerveau chez moi et en plus je comprends pas du premier coup ce que je lis.

    Bon, je continue les contrôles et je vous dis.

  16. #16
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 121
    Points : 53
    Points
    53
    Par défaut
    Bonjour à toute et à tous,

    J'arrive maintenant à faire un champ table avec des colonnes grâce à la requête que m'avait communiqué tbc92 et le rajout des GROUP BY.
    Code SQL : 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
     
    select 
     A.Code,  A.Reference, a.designation, a.couleur, a.fournisseur, a.quantite ,
     sum (case when b.IdMagasin = 1 then  b.reception_ligne_quantite else null end ) as Quant1,
     sum (case when b.IdMagasin = 2 then  b.reception_ligne_quantite else null end ) as Quant2,
     sum (case when b.IdMagasin = 3 then  b.reception_ligne_quantite else null end ) as Quant3,
     sum (case when b.IdMagasin = 4 then  b.reception_ligne_quantite else null end ) as Quant4,
     sum (case when b.IdMagasin = 5 then  b.reception_ligne_quantite else null end ) as Quant5,
     sum (case when b.IdMagasin = 6 then  b.reception_ligne_quantite else null end ) as Quant6
     
     from
     (
     SELECT 
    	V.IDproduit AS Code,
    	P.produit_ref_produit AS Reference,
    	P.produit_nom_produit AS Designation,
    	PC.Couleur_Nom AS Couleur,
    	F.Nom_fournisseur AS Fournisseur,
    	SUM(V.Panier_Ligne_Quantite) AS Quantite
     
     FROM 
    	VENTE_LIGNE_2020 V
    	left outer join PRODUIT P ON V.IDproduit = P.IDproduit
    	left outer join PRODUIT_COULEUR PC ON PC.IDcouleur = P.IDcouleur
    	left outer join FOURNISSEUR F ON F.IDfournisseur = P.IDfournisseur
     
     GROUP BY
    	V.IDproduit,
    	P.produit_ref_produit,
    	P.produit_nom_produit,
    	PC.Couleur_Nom,
    	F.Nom_fournisseur
     ) a,
    ( 
     SELECT RL.Idproduit , R.IDmagasin ,  RL.reception_ligne_quantite
     FROM RECEPTION_LIGNE  RL 
     LEFT OUTER JOIN RECEPTION R ON R.IDreception = RL.IDreception
     ) b
     where b.idProduit (+)= a.Code
     
     GROUP BY
     A.Code,  A.Reference, a.designation, a.couleur, a.fournisseur, a.quantite

    Fort de cette requête, j'ai voulu continué pour afficher le stock disponible qui est RECEPTION_LIGNE.reception_ligne_quantite + TRANSFERT_LIGNE.Transfert_Ligne_Quantite_Entrant - TRANSFERT_LIGNE.Transfert_Ligne_Quantite_Sortant + INVENTAIRE_LIGNE.Inventaire_Ligne_Quantite_Comptee - VENTE_LIGNE_2020.Panier_Ligne_Quantite.

    J'ai lu quelques discussions avec des requetes imbriquées, été voir https://sql.sh/cours/sous-requete et https://doc.pcsoft.fr/?2034009

    Et me suis lancé à la conquête de "THE" requête:
    Code SQL : 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
     
    select 
     A.Code,  A.Reference, a.designation, a.couleur, a.fournisseur, a.quantite ,
     sum (case when b.IdMagasin = 1 then  b.reception_ligne_quantite else null end )+sum (case when c.IdMagasin = 1 then  c.Inventaire_Ligne_Quantite_Comptee else null end ) as Quant1,
     sum (case when b.IdMagasin = 2 then  b.reception_ligne_quantite else null end )+sum (case when c.IdMagasin = 2 then  c.Inventaire_Ligne_Quantite_Comptee else null end ) as Quant2,
     sum (case when b.IdMagasin = 3 then  b.reception_ligne_quantite else null end )+sum (case when c.IdMagasin = 3 then  c.Inventaire_Ligne_Quantite_Comptee else null end ) as Quant3,
     sum (case when b.IdMagasin = 4 then  b.reception_ligne_quantite else null end )+sum (case when c.IdMagasin = 4 then  c.Inventaire_Ligne_Quantite_Comptee else null end ) as Quant4,
     sum (case when b.IdMagasin = 5 then  b.reception_ligne_quantite else null end )+sum (case when c.IdMagasin = 5 then  c.Inventaire_Ligne_Quantite_Comptee else null end ) as Quant5,
     sum (case when b.IdMagasin = 6 then  b.reception_ligne_quantite else null end )+sum (case when c.IdMagasin = 6 then  c.Inventaire_Ligne_Quantite_Comptee else null end ) as Quant6
     
     from
     (
     SELECT 
    	V.IDproduit AS Code,
    	P.produit_ref_produit AS Reference,
    	P.produit_nom_produit AS Designation,
    	PC.Couleur_Nom AS Couleur,
    	F.Nom_fournisseur AS Fournisseur,
    	SUM(V.Panier_Ligne_Quantite) AS Quantite
     
     FROM 
    	VENTE_LIGNE_2020 V
    	left outer join PRODUIT P ON V.IDproduit = P.IDproduit
    	left outer join PRODUIT_COULEUR PC ON PC.IDcouleur = P.IDcouleur
    	left outer join FOURNISSEUR F ON F.IDfournisseur = P.IDfournisseur
     
     GROUP BY
    	V.IDproduit,
    	P.produit_ref_produit,
    	P.produit_nom_produit,
    	PC.Couleur_Nom,
    	F.Nom_fournisseur
     ) a,
    ( 
     SELECT RL.Idproduit , R.IDmagasin ,  RL.reception_ligne_quantite
     FROM RECEPTION_LIGNE  RL 
     LEFT OUTER JOIN RECEPTION R ON R.IDreception = RL.IDreception
     ) b,
     ( 
     SELECT IL.Idproduit , I.IDmagasin ,  IL.Inventaire_Ligne_Quantite_Comptee
     FROM INVENTAIRE_LIGNE  IL 
     LEFT OUTER JOIN INVENTAIRE I ON I.IDinventaire = IL.IDinventaire
     )c
     where b.idProduit (+)= a.Code
     
     GROUP BY
     A.Code,  A.Reference, a.designation, a.couleur, a.fournisseur, a.quantite

    Rien qu'en essayant de rajouter les produits comptés à l'inventaire ça ne fonctionne pas. Pourtant le SUM(CASE WHEN + SUM(CASE WHEN c'est truc que j'avais déjà fait en SQL sur une base PHPMyADMIN et qui fonctionnait.

    Si quelqu'un à un retour d'expérience à partager, je suis preneur.

    Merci

    Gregus


    [EDIT] Je crois que j'ai une piste, en fait les premiers essais sont concluant, il faut que je teste juste avec toutes les opérations [/EDIT]

  17. #17
    Membre confirmé Avatar de Nhaps
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2011
    Messages : 350
    Points : 603
    Points
    603
    Par défaut
    Bonjour,

    Je serai toi j'aurai fait une requête en utilisant les CTE, ça te permettrai d'avoir une requête nettement plus lisible, et du coup tu pourras l'affiner plus facilement.
    Windev 23 - SQL SERVER - PHP
    Play : TFT - Jeux indé

  18. #18
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 121
    Points : 53
    Points
    53
    Par défaut
    Bonjour Nhaps,

    Citation Envoyé par Nhaps Voir le message
    Bonjour,

    Je serai toi j'aurai fait une requête en utilisant les CTE, ça te permettrai d'avoir une requête nettement plus lisible, et du coup tu pourras l'affiner plus facilement.
    Je ne suis pas rompu à tous les acronymes. Qu'est-ce que les CTE ? Avant de te poser la question, petite recherche sur le web.
    Première réponse https://sgbd.developpez.com/actu/101...riel-de-Lyche/

    Je ne suis pas un spécialiste, ni un pro, alors dans mes termes à moi, si je comprends bien, les sous-requêtes qui sont faites dans le FROM, tu les découpes en requêtes qui s'exécute avant une requête finale et qui sont utilisées (ou appelée, je ne connait pas le terme technique) dans la requête finale (ou principale) ainsi tu isoles chacune des requêtes qui te donnent les résultats cohérents dont tu as besoin dans une table à usage unique qui sert dans une autre requête (comme ça tu es certain que celle-ci fonctionne et peut-être n'as-tu pas besoin de revenir dessus).

    Si c'est ça l'idée, c'est pas mal.

    J'ai fait, un peu pareil, à la main. En fait, dans une autre discussion sur le forum tbc92 conseillé d'utiliser WDMap pour tester des bouts de requête. Du coup j'ai testé les bouts de sous-requête pour vérifier qu'elles fonctionnaient bien. Alors j'aurai pu en faire une CTE plutôt qu'une sous-requête. Et faire de même pour toutes les sous-requêtes. Sympa l'idée, si c'est ça, plutôt que de chercher dans toute la syntaxe et de se poser des questions sur des trucs ou ta pas besoin.

    Merci pour l'info, je touche au but alors peut-être que je ferais ça pour le code soit plus propre dans un second temps.

    Merci

  19. #19
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 121
    Points : 53
    Points
    53
    Par défaut
    Bon, je crois que j'ai réussi. (Je crois, parce que je doute toujours. Ce n'ai pas

    Je voudrais adresser un grand merci à toutes et tous, parce que si j'ai réussi, c'est aussi en lisant d'anciennes discussions sur les sous-requêtes.

    Un grand merci à tbc92 qui m'a plus que mis sur la voie avec sa proposition de code et ben34 qui avait proposer la même construction.

    Voici le code qui m'a permis d'arriver au résultat final désiré. Il est peut-être pas très propre, mais je suis preneur de toutes les remarques. D'ailleurs je vais tester la proposition de Nhaps pour voir ce que ça donne et notamment si ça fait gagner du temps.

    Code SQL : 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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    select
    A.Code,  A.Reference, a.designation, a.couleur, a.fournisseur, a.quantite ,
    COALESCE(b.Quant_RL_1,0) + COALESCE(c.Quant_INV_1,0) + COALESCE(e.Quant_TE_1,0) - COALESCE(d.Quant_VL_2020_1,0) - COALESCE(f.Quant_TS_1,0) as Quant1,
    COALESCE(b.Quant_RL_2,0) + COALESCE(c.Quant_INV_2,0) + COALESCE(e.Quant_TE_2,0) - COALESCE(d.Quant_VL_2020_2,0) - COALESCE(f.Quant_TS_2,0) as Quant2,
    COALESCE(b.Quant_RL_3,0) + COALESCE(c.Quant_INV_3,0) + COALESCE(e.Quant_TE_3,0) - COALESCE(d.Quant_VL_2020_3,0) - COALESCE(f.Quant_TS_3,0) as Quant3,
    COALESCE(b.Quant_RL_4,0) + COALESCE(c.Quant_INV_4,0) + COALESCE(e.Quant_TE_4,0) - COALESCE(d.Quant_VL_2020_4,0) - COALESCE(f.Quant_TS_4,0) as Quant4,
    COALESCE(b.Quant_RL_5,0) + COALESCE(c.Quant_INV_5,0) + COALESCE(e.Quant_TE_5,0) - COALESCE(d.Quant_VL_2020_5,0) - COALESCE(f.Quant_TS_5,0) as Quant5,
    COALESCE(b.Quant_RL_6,0) + COALESCE(c.Quant_INV_6,0) + COALESCE(e.Quant_TE_6,0) - COALESCE(d.Quant_VL_2020_6,0) - COALESCE(f.Quant_TS_6,0) as Quant6
     
     from
     (
     SELECT 
    	V.IDproduit AS Code,
    	P.produit_ref_produit AS Reference,
    	P.produit_nom_produit AS Designation,
    	PC.Couleur_Nom AS Couleur,
    	F.Nom_fournisseur AS Fournisseur,
    	SUM(V.Panier_Ligne_Quantite) AS Quantite
     
     FROM 
    	VENTE_LIGNE_2020 V
    	left outer join PRODUIT P ON V.IDproduit = P.IDproduit
    	left outer join PRODUIT_COULEUR PC ON PC.IDcouleur = P.IDcouleur
    	left outer join FOURNISSEUR F ON F.IDfournisseur = P.IDfournisseur
     
     GROUP BY
    	V.IDproduit,
    	P.produit_ref_produit,
    	P.produit_nom_produit,
    	PC.Couleur_Nom,
    	F.Nom_fournisseur
     ) a,
    ( 
     SELECT RL.Idproduit , sum (case when R.IdMagasin = 1 then  RL.reception_ligne_quantite else null end ) AS Quant_RL_1,
     sum (case when R.IdMagasin = 2 then  RL.reception_ligne_quantite else null end ) AS Quant_RL_2,
     sum (case when R.IdMagasin = 3 then  RL.reception_ligne_quantite else null end ) AS Quant_RL_3,
     sum (case when R.IdMagasin = 4 then  RL.reception_ligne_quantite else null end ) AS Quant_RL_4,
     sum (case when R.IdMagasin = 5 then  RL.reception_ligne_quantite else null end ) AS Quant_RL_5,
     sum (case when R.IdMagasin = 6 then  RL.reception_ligne_quantite else null end ) AS Quant_RL_6
     FROM RECEPTION_LIGNE  RL 
     LEFT OUTER JOIN RECEPTION R ON R.IDreception = RL.IDreception
     GROUP BY RL.Idproduit
     ) b,
    ( 
     SELECT IL.Idproduit , sum (case when I.IdMagasin = 1 then  IL.Inventaire_Ligne_Quantite_Comptee else null end ) AS Quant_INV_1,
     sum (case when I.IdMagasin = 2 then  IL.Inventaire_Ligne_Quantite_Comptee else null end ) AS Quant_INV_2,
     sum (case when I.IdMagasin = 3 then  IL.Inventaire_Ligne_Quantite_Comptee else null end ) AS Quant_INV_3,
     sum (case when I.IdMagasin = 4 then  IL.Inventaire_Ligne_Quantite_Comptee else null end ) AS Quant_INV_4,
     sum (case when I.IdMagasin = 5 then  IL.Inventaire_Ligne_Quantite_Comptee else null end ) AS Quant_INV_5,
     sum (case when I.IdMagasin = 6 then  IL.Inventaire_Ligne_Quantite_Comptee else null end ) AS Quant_INV_6
     FROM INVENTAIRE_LIGNE  IL 
     LEFT OUTER JOIN INVENTAIRE I ON I.IDinventaire = IL.IDinventaire
     GROUP BY IL.Idproduit
     ) c,
     ( 
     SELECT VL_2020.Idproduit , sum (case when V_2020.IdMagasin = 1 then  VL_2020.Panier_Ligne_Quantite else null end ) AS Quant_VL_2020_1,
     sum (case when V_2020.IdMagasin = 2 then  VL_2020.Panier_Ligne_Quantite else null end ) AS Quant_VL_2020_2,
     sum (case when V_2020.IdMagasin = 3 then  VL_2020.Panier_Ligne_Quantite else null end ) AS Quant_VL_2020_3,
     sum (case when V_2020.IdMagasin = 4 then  VL_2020.Panier_Ligne_Quantite else null end ) AS Quant_VL_2020_4,
     sum (case when V_2020.IdMagasin = 5 then  VL_2020.Panier_Ligne_Quantite else null end ) AS Quant_VL_2020_5,
     sum (case when V_2020.IdMagasin = 6 then  VL_2020.Panier_Ligne_Quantite else null end ) AS Quant_VL_2020_6
     FROM VENTE_LIGNE_2020  VL_2020 
     LEFT OUTER JOIN VENTE_2020 V_2020 ON V_2020.IDpanier = VL_2020.IDpanier
     GROUP BY VL_2020.Idproduit
     ) d,
     ( 
     SELECT TL.Idproduit,
     sum (case when T.Transfert_Preparation_IDmagasin = 1 then  TL.Transfert_Ligne_Quantite else null end ) AS Quant_TE_1,
     sum (case when T.Transfert_Preparation_IDmagasin = 2 then  TL.Transfert_Ligne_Quantite else null end ) AS Quant_TE_2,
     sum (case when T.Transfert_Preparation_IDmagasin = 3 then  TL.Transfert_Ligne_Quantite else null end ) AS Quant_TE_3,
     sum (case when T.Transfert_Preparation_IDmagasin = 4 then  TL.Transfert_Ligne_Quantite else null end ) AS Quant_TE_4,
     sum (case when T.Transfert_Preparation_IDmagasin = 5 then  TL.Transfert_Ligne_Quantite else null end ) AS Quant_TE_5,
     sum (case when T.Transfert_Preparation_IDmagasin = 6 then  TL.Transfert_Ligne_Quantite else null end ) AS Quant_TE_6
     FROM TRANSFERT_LIGNE  TL 
     LEFT OUTER JOIN TRANSFERT T ON T.IDtransfert = TL.IDtransfert
     GROUP BY TL.Idproduit
     ) e,
     ( 
     SELECT TL.Idproduit,
     sum (case when T.Transfert_Reception_IDmagasin = 1 then  TL.Transfert_Ligne_Quantite else null end ) AS Quant_TS_1,
     sum (case when T.Transfert_Reception_IDmagasin = 2 then  TL.Transfert_Ligne_Quantite else null end ) AS Quant_TS_2,
     sum (case when T.Transfert_Reception_IDmagasin = 3 then  TL.Transfert_Ligne_Quantite else null end ) AS Quant_TS_3,
     sum (case when T.Transfert_Reception_IDmagasin = 4 then  TL.Transfert_Ligne_Quantite else null end ) AS Quant_TS_4,
     sum (case when T.Transfert_Reception_IDmagasin = 5 then  TL.Transfert_Ligne_Quantite else null end ) AS Quant_TS_5,
     sum (case when T.Transfert_Reception_IDmagasin = 5 then  TL.Transfert_Ligne_Quantite else null end ) AS Quant_TS_6
     FROM TRANSFERT_LIGNE  TL 
     LEFT OUTER JOIN TRANSFERT T ON T.IDtransfert = TL.IDtransfert
     GROUP BY TL.Idproduit
     ) f
     where b.idProduit (+)= a.Code AND c.IDproduit (+)=a.code AND d.IDproduit (+)=a.code AND e.IDproduit (+)=a.code AND f.IDproduit (+)=a.code
     
     GROUP BY
     A.Code,  A.Reference, a.designation, a.couleur, a.fournisseur, a.quantite, quant1, quant2, quant3, quant4, quant5, quant6

    Pour la petite info j'ai utiliser COALESCE parce que si dans une sous-requête il n'y a pas de données cela casse la mécanique de l'opération et il n'y a pas de résultat dans la cellule.

    Voilà, je passe en résolu, mais je reste en veille de toute proposition d'amélioration.

    Merci

    Bien à vous

    Grégus

    N.B.: Je reviendrai j'ai encore des idées d'améliorations.

    Une petite question me revient en me relisant, pourquoi (+) dans la commande WHERE ?

  20. #20
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 055
    Points : 9 394
    Points
    9 394
    Par défaut
    Pourquoi (+) ...

    (+) est plus ou moins un synonyme de LEFT OUTER JOIN

    Si on ne met pas le (+)
    select * from table1, table2 where table2.idProduit = table1.idProduit;
    On aura dans le résultat uniquement les idProduit communs aux 2 tables.

    Avec (+)
    select * from table1, table2 where table2.idProduit (+)= table1.idProduit;
    ou
    select * from table1, table2 where table1.idProduit = table2.idProduit (+);
    On aura dans le résultat tous les idProduit de table1 , et en regard, les informations issues de table2 si l'idProduit est dans table2.

    Dans la norme, (+) est déconseillé, je crois que c'est en 1992 que les normalisateurs ont dit : n'utilisez plus (+), remplacez le par left outer join ou Right outer join. Peut-être qu'une version à venir de Windev n'acceptera plus cette syntaxe avec (+) ... ce serait dans la logique, on a été prévenu, il faut utiliser outer join au lieu de (+), mais je n'y crois pas. Il y a trop d'utilisateurs qui restent partisans de (+), même parmi ceux qui ont appris SQL bien après 1992.

    Dans les faits, j'ai mis (+) dans le modèle que je t'ai donné, parce que je trouve que c'est tellement plus pratique !

    Ici, on se retrouve avec des portions avec la bonne norme (left outer join) et d'autres pas très propres (+) .... tant pis !


    Les CTE

    Je ne connaissais pas l'acronyme non plus, c'est la commande WITH.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    With X1 as ( 
    un gros SELECT bien tordu 
    ) ,
    X2 as ( 
    un gros SELECT bien tordu 
    ) ,
    X3 as ( 
    un gros SELECT bien tordu 
    ) 
    Select   ...ce qu'on veut
    from X1 
    left outer join  X2 on ( ... )
    left outer join  X3 on ( ... )
    On définit des pseudo-tables X1 X2 X3 , résultats de SELECT éventuellement compliqués, et dans la foulée, on utilise ces pseudo-table.


    Cette commande est très pratique, vraiment très bien pour des requêtes compliquées. 100% d'accord pour dire que c'est très bien.

    MAIS,
    Sauf erreur de ma part (je peux me tromper), cette syntaxe n'est pas acceptée par HFSQL.

    J'imagine que tes données sont dans des fichiers HFSQL, tu n'utilises pas MySQL, ni Postgre ni Oracle ... et dans ce cas, dommage, pas de possibilité d'utiliser la syntaxe WITH ...
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/09/2016, 15h34
  2. [WD12] Maj des calculs sur les fichiers de données
    Par karim15 dans le forum WinDev
    Réponses: 7
    Dernier message: 09/11/2012, 10h31
  3. Effectuer des opérations sur plusieurs fichiers txt
    Par Jim la truite dans le forum MATLAB
    Réponses: 4
    Dernier message: 11/08/2008, 23h18
  4. [Unix] problème avec des permissions sur un fichier
    Par bulbo dans le forum Administration système
    Réponses: 3
    Dernier message: 20/02/2008, 15h04
  5. Requête avec des tables de plusieurs bases
    Par Oluha dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/04/2005, 16h56

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