PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Limiter la jointure à une seule ligne

SELECT (count(*) * sum(s."price")) AS amount
     , 'rma'       AS "creditType"
     , c."company" AS "client"
     , c.id        AS "ClientId"
     , r.* 
FROM   "Rmas"            r
JOIN   "EsnsRmas"        er ON er."RmaId" = r."id"
JOIN   "Esns"            e  ON e.id = er."EsnId"
JOIN  (
   SELECT DISTINCT ON ("EsnId") *
   FROM   "EsnsSalesOrderItems"
   ORDER  BY "EsnId", "createdAt" DESC
   )                     es ON es."EsnId" = e."id"
JOIN   "SalesOrderItems" s  ON s."id" = es."SalesOrderItemId"
JOIN   "Clients"         c  ON c."id" = r."ClientId"
WHERE  r."credited" = FALSE
AND    r."verifyStatus" IS NOT NULL 
GROUP  BY c.id, r.id;

Votre requête dans la question a un agrégat illégal sur un autre agrégat :

sum((select count(*) as itemCount) * "SalesOrderItems"."price") as amount

Simplifié et converti en syntaxe légale :

(count(*) * sum(s."price")) AS amount

Mais voulez-vous vraiment multiplier avec le nombre par groupe ?

Je récupère la ligne unique par groupe dans "EsnsSalesOrderItems" avec DISTINCT ON . Explication détaillée :

J'ai également ajouté des alias de table et un formatage pour rendre la requête plus facile à analyser pour les yeux humains. Si vous pouviez éviter le cas de chameau, vous pourrait se débarrasser de tous les guillemets doubles assombrir la vue.