PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Petit coup de pouce SQL
Petit coup de pouce SQL
Iniciado por Pierre, 24,mar. 2020 11:41 - 3 respuestas
Miembro registrado
185 mensajes
Publicado el 24,marzo 2020 - 11:41
Bonjour,

Vous trouverez ci dessous 2 requêtes avec le résultat correspondant.

Dans la requête partielle, j'ai une QtéRecue avec 2 valeurs qui correspondent à mon set de données.
SELECT
LigneCommande.IDPieces AS IDPiece,
LigneCommande.Quantité AS QtéCommandée,
LigneCommande.IdLigneBcde AS IdLigne,
SuiviCde.QtéRecue AS QtéRecue,
CASE LigneCommande.DatePrévue WHEN '' THEN Bcde.LivraisonDateEstimée ELSE LigneCommande.DatePrévue END AS DatePrévue

FROM
LigneCommande
LEFT OUTER JOIN(
SELECT
SUM(StockMvt.Quantité) AS QtéReçue,
StockMvt.IdLigneBcde AS IdLigneBcde
FROM
StockMvt
WHERE
IdLigneBcde<>0 AND StockMvt.Type=2
GROUP BY
IdLigneBcde
)
AS SuiviCde ON SuiviCde.IdLigneBcde=IdLigne AND LigneCommande.Quantité>SuiviCde.QtéRecue
LEFT OUTER JOIN Bcde ON Bcde.IDBcde=LigneCommande.IDBcde
WHERE LigneCommande.IDPieces=65677

// )







Dans la requête complète, la somme de QtéRecue me donne NULL

//Connaitre la DATE probable de livraison d'une pièce, multi-commande, multi-réception
SELECT
MIN(NdxMeilleurDelai.DatePrévue) AS DélaiCourt,
MAX(NdxMeilleurDelai.DatePrévue) AS DélaiLong,
NdxMeilleurDelai.IDPiece AS IdPiece,
SUM(NdxMeilleurDelai.QtéCommandée) AS QtéCommandée,
SUM(NdxMeilleurDelai.QtéRecue) AS QtéRecue
FROM
Pieces
LEFT OUTER JOIN(


SELECT
LigneCommande.IDPieces AS IDPiece,
LigneCommande.Quantité AS QtéCommandée,
LigneCommande.IdLigneBcde AS IdLigne,
SuiviCde.QtéRecue AS QtéRecue,
CASE LigneCommande.DatePrévue WHEN '' THEN Bcde.LivraisonDateEstimée ELSE LigneCommande.DatePrévue END AS DatePrévue
// sum(suivicde.Qtérecue)

FROM
LigneCommande
LEFT OUTER JOIN(
SELECT
SUM(StockMvt.Quantité) AS QtéReçue,
StockMvt.IdLigneBcde AS IdLigneBcde
FROM
StockMvt
WHERE
IdLigneBcde<>0 AND StockMvt.Type=2
GROUP BY
IdLigneBcde
)
AS SuiviCde ON SuiviCde.IdLigneBcde=IdLigne AND LigneCommande.Quantité>SuiviCde.QtéRecue
LEFT OUTER JOIN Bcde ON Bcde.IDBcde=LigneCommande.IDBcde


)
AS NdxMeilleurDelai ON NdxMeilleurDelai.Idpiece=Pieces.IDPieces
WHERE
Pieces.IDPieces IN (65677)
GROUP BY
IdPiece







Quelqu’un peut-il m'aider à comprendre ce que je fais de travers ?

Merci d'avance

--
Pierre
Miembro registrado
134 mensajes
Publicado el 24,marzo 2020 - 11:52
Bonjour,

Peut être un
SUM( NVL( StockMvt.Quantité, 0 ) ) AS QtéReçue,

Qui permet de mettre un 0 par défaut si c'est NULL
Miembro registrado
4.362 mensajes
Publicado el 24,marzo 2020 - 11:58
Bonjour,
Cela provient de ton NULL. Dans la plupart des cas. NULL + n'importe quoi = NULL. NULL ne vaut pas 0 mais "Valeur inconnue". Si j'ajoute une valeur à quelque chose dont je ne connais pas la valeur. Je ne connaîtrait pas le résultat.
Afin d'éviter cela, il faut ajouter créer une sous-requête avec la condition IS NOT NULL pour calculler ta quantité reçue, tout en conservant ta requête initiale, sinon, le total des qtés commandées ne correspondra pas aux données réelles.

--
Il y a peut être plus simple, mais, ça tourne
Miembro registrado
185 mensajes
Publicado el 24,marzo 2020 - 14:40
Merci à tous les deux pour votre contribution.

NVL n'a pas donné les résultats escomptés.
Pour faire la sous requête, suite à des messages d'erreur du compilateur, j'ai revu le code de l'existant et voici la solution

//Connaitre la DATE probable de livraison d'une pièce, multi-commande, multi-réception
SELECT
MIN(NdxMeilleurDelai.DatePrévue) AS DélaiCourt,
MAX(NdxMeilleurDelai.DatePrévue) AS DélaiLong,
// NdxMeilleurDelai.IDPiece as IdPiece,
Pieces.IDPieces AS IdPiece,
SUM(NdxMeilleurDelai.QtéCommandée) AS QtéCommandée,
SUM(NdxMeilleurDelai.QtéRecue) AS QtéRecue
FROM
Pieces
LEFT OUTER JOIN(

SELECT
LigneCommande.IDPieces AS IDPiece,
LigneCommande.Quantité AS QtéCommandée,
LigneCommande.IdLigneBcde AS IdLigne,
SuiviCde.QtéRecue AS QtéRecue,
CASE LigneCommande.DatePrévue WHEN '' THEN Bcde.LivraisonDateEstimée ELSE LigneCommande.DatePrévue END AS DatePrévue

FROM
LigneCommande
LEFT OUTER JOIN(
SELECT
SUM(StockMvt.Quantité) AS QtéReçue,
StockMvt.IdLigneBcde AS IdLigneBcde
FROM
StockMvt
WHERE
IdLigneBcde<>0 AND StockMvt.Type=2
GROUP BY
IdLigneBcde
)
remplacer >>> AS SuiviCde ON SuiviCde.IdLigneBcde=IdLigne AND LigneCommande.Quantité>SuiviCde.QtéRecue
par >>> AS SuiviCde ON SuiviCde.IdLigneBcde=LigneCommande.IdLigneBcde and ligneCommande.Quantité>SuiviCde.QtéRecue

LEFT OUTER JOIN Bcde ON Bcde.IDBcde=LigneCommande.IDBcde
// where LigneCommande.IDPieces=65677

)
AS NdxMeilleurDelai ON NdxMeilleurDelai.Idpiece=Pieces.IDPieces
WHERE
Pieces.IDPieces IN (65677)
GROUP BY
Pieces.IDPieces


Bonne aprèm

--
Pierre