PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Ограничете съединяването до един ред

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;

Вашата заявка във въпроса съдържа незаконен агрегат спрямо друг агрегат:

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

Опростен и преобразуван в легален синтаксис:

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

Но наистина ли искате да умножите с броя на група?

Извличам единичен ред на група в "EsnsSalesOrderItems" с DISTINCT ON . Подробно обяснение:

Добавих също псевдоними на таблици и форматиране, за да направя заявката по-лесна за анализиране от човешки очи. Ако можехте избягвайте камилския случай, може да се отърве от всички двойни кавички замъгляване на гледката.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Няколко области на подобрения в PostgreSQL 9.4

  2. Как да увеличите автоматично буквено-цифровата стойност в postgresql?

  3. PostgreSQL RDS избягва твърдото кодиране на паролата за връзка, когато използва dblink_connect()

  4. Несъответствие на версията на Postgresql 9.2 pg_dump

  5. Създайте база данни на Postgres с помощта на python