PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Limita il join a una riga

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;

La tua query nella domanda ha un aggregato illegale rispetto a un altro aggregato:

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

Semplificato e convertito in sintassi legale:

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

Ma vuoi davvero moltiplicare con il conteggio per gruppo?

Recupero la singola riga per gruppo in "EsnsSalesOrderItems" con DISTINCT ON . Spiegazione dettagliata:

Ho anche aggiunto alias di tabella e formattazione per semplificare l'analisi della query per gli occhi umani. Se potessi evitare il caso del cammello, potrebbe eliminare tutte le virgolette doppie offuscando la vista.