PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Join auf eine Zeile beschränken

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;

Ihre Abfrage in der Frage hat ein unzulässiges Aggregat gegenüber einem anderen Aggregat:

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

Vereinfacht und in legale Syntax umgewandelt:

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

Aber wollen Sie wirklich mit der Anzahl pro Gruppe multiplizieren?

Ich rufe die einzelne Zeile pro Gruppe in "EsnsSalesOrderItems" ab mit DISTINCT ON . Ausführliche Erklärung:

Ich habe auch Tabellenaliase und Formatierungen hinzugefügt, um die Abfrage für das menschliche Auge leichter parsen zu können. Wenn Sie Kamelfall vermeiden könnten könnte alle doppelten Anführungszeichen loswerden trübt die Sicht.