sql >> Databáze >  >> RDS >> PostgreSQL

Omezit spojení na jeden řádek

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;

Váš dotaz v otázce obsahuje nelegální agregát nad jiným agregátem:

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

Zjednodušená a převedená na zákonnou syntaxi:

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

Ale opravdu chcete násobit počtem na skupinu?

Načítám jeden řádek na skupinu v "EsnsSalesOrderItems" s nastavením DISTINCT ON . Podrobné vysvětlení:

Také jsem přidal aliasy a formátování tabulek, aby se dotaz snadněji analyzoval pro lidské oči. Pokud byste se mohli vyhnout případu velblouda, mohl se zbavit všech dvojitých uvozovek zatemnění výhledu.



  1. Řazení podle řetězce, který začíná číslem - ActiveRecord

  2. Podřetězec MySQL mezi dvěma řetězci

  3. Proč klíčové slovo MYSQL IN nebere v úvahu hodnoty NULL

  4. Jak mohu přesunout databázi SQL Server LocalDb z jednoho počítače na druhý?