sql >> Databasteknik >  >> RDS >> PostgreSQL

Begränsa sammanfogningen till en rad

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;

Din fråga i frågan har ett olagligt aggregat framför ett annat aggregat:

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

Förenklad och konverterad till laglig syntax:

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

Men vill du verkligen multiplicera med antalet per grupp?

Jag hämtar den enda raden per grupp i "EsnsSalesOrderItems" med DISTINCT ON . Detaljerad förklaring:

Jag lade också till tabellalias och formatering för att göra frågan lättare att analysera för mänskliga ögon. Om du kunde undvika kamelfall kunde bli av med alla dubbla citattecken grumlar utsikten.



  1. Räknar DISTINCT över flera kolumner

  2. Materialiserad vy i mysql

  3. Hur man avinstallerar SQL Server Management Studio(SSMS) - SQL Server/TSQL Tutorial Del 23.1

  4. Är det möjligt att flytta en post från en tabell till en annan med en enda SQL-sats?