PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Batasi bergabung menjadi satu baris

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;

Kueri Anda dalam pertanyaan memiliki agregat ilegal di atas agregat lain:

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

Disederhanakan dan dikonversi ke sintaks legal:

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

Tapi apakah Anda benar-benar ingin mengalikan dengan hitungan per grup?

Saya mengambil satu baris per grup di "EsnsSalesOrderItems" dengan DISTINCT ON . Penjelasan detail:

Saya juga menambahkan alias tabel dan pemformatan untuk membuat kueri lebih mudah diurai untuk mata manusia. Jika Anda dapat hindari kasus unta Anda bisa menghilangkan semua tanda kutip ganda mengaburkan pandangan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Formulir pencarian tidak merutekan ke pengontrol yang tepat di Rails 5.1

  2. Bagaimana cara menggunakan pemicu PostgreSQL?

  3. bagaimana cara memiliki filter Accent-insensitive di Django dengan postgres?

  4. apa yang dilakukan operator @> di postgres?

  5. Cara menggunakan Joda-Time dengan java.sql.Timestamp