2 pièce(s) jointe(s)
SQL Postgres - Jointure entre tables qui ramènent un nombre de lignes différent
Bonjour à toutes et à tous,
Je suis confronté à un souci en SQL, et mon cerveau bute actuellement sans trouver la réponse.
Explications : Je suis sur une BDD Postgresql (v9.6).
Je dois concevoir une requête Sql qui permettra de générer un rapport PDF assez simple.
Mon problème : Lors de ma jointure entre plusieurs tables, une des tables ramène plus de lignes que l'autre. Du coup, mes données sont erronées car le SUM(colonne) se répète plusieurs fois.
Voici la requête qui pose le souci :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
SELECT COALESCE(SUM(pi.totalweight),0) AS Poids,
COALESCE(SUM(pi.totalbrut),0) AS Brut,
COALESCE(SUM(pit.value_purchase_invoice_tax),0) AS Tax,
(COALESCE(SUM(pi.totalbrut),0)-COALESCE(SUM(pit.value_purchase_invoice_tax),0)) AS Net,
(COALESCE(SUM(pi.totalbrut),0) / COALESCE(SUM(pi.totalweight),0)) AS PrixReel,
per.aiph AS PrixRef
FROM purchase_invoice pi
INNER JOIN planter p ON pi.planter_id = p.id
INNER JOIN purchase_invoice_tax pit ON pi.id = pit.purchase_invoice_id
INNER JOIN purchase_invoice_delivery pid ON pi.id = pid.purchase_invoice_id --Renvoie plusieurs lignes
INNER JOIN delivery d ON pid.delivery_id = d.id
INNER JOIN period per ON d.period_id = per.id
WHERE p.code = '21140'
AND pi.date_invoice >= '2020-04-01 00:00:00'
AND pi.date_invoice <= '2020-04-30 23:59:59'
GROUP BY per.aiph
; |
Le souci vient de la jointure sur purchase_invoice_delivery.
En effet, pour une facture (purchase_invoice), il peut y avoir plusieurs livraisons provenant d'un fermier(table planter).
Et ces livraisons possèdent un prix de référence logé dans la table period.aiph.
Le prix de référence est propre à une période qui est un mois de l'année.
Quand il y a qu'une livraison par facture, pas de souci, tout marche.
En revanche, dès qu'on a plusieurs livraisons, les données sont multipliées par le nombre de livraisons.
Je comprend très bien pourquoi (je veux dire, ça semble logique). Mais je ne trouve pas de moyens pour contourner le problème.
Je suis preneur si une âme bien attentionnée pourra m'aider.
Merci,
Cordialement,
Olivier
Capture 1 : avant d'intégrer le prix de référence
Pièce jointe 572597
Capture 2 : Après intégration du prix de référence
Pièce jointe 572601