sql >> Database >  >> RDS >> PostgreSQL

Deelname beperken tot één rij

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;

Uw zoekopdracht in de vraag heeft een illegaal aggregaat boven een ander aggregaat:

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

Vereenvoudigd en omgezet naar juridische syntaxis:

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

Maar wil je echt vermenigvuldigen met het aantal per groep?

Ik haal de enkele rij per groep op in "EsnsSalesOrderItems" met DISTINCT ON . Gedetailleerde uitleg:

Ik heb ook tabelaliassen en opmaak toegevoegd om de query gemakkelijker te analyseren voor menselijke ogen. Als je kameel zou kunnen vermijden zou alle dubbele aanhalingstekens kunnen verwijderen vertroebelt het uitzicht.



  1. MySQL-sortering om meertalige gegevens van onbekende taal op te slaan

  2. Hoe voeg je een PHP-constante in een SQL-query in?

  3. Postgresql enorm prestatieverschil bij gebruik van IN vs NOT IN

  4. Hoe om te gaan met booleaanse waarden in SQLite met JavaScript-proxy's