PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Limitar junção a uma linha

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;

Sua consulta na pergunta tem um agregado ilegal sobre outro agregado:
sum((select count(*) as itemCount) * "SalesOrderItems"."price") as amount

Simplificado e convertido em sintaxe legal:
(count(*) * sum(s."price")) AS amount

Mas você realmente quer multiplicar com a contagem por grupo?

Eu recupero a única linha por grupo em "EsnsSalesOrderItems" com DISTINCT ON . Explicação detalhada:

Também adicionei aliases de tabela e formatação para facilitar a análise da consulta para os olhos humanos. Se você pudesse evitar camel case você poderia se livrar de todas as aspas duplas turvando a vista.