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

Рекурсивна заявка със сума в Postgres

Това е опростена версия на правилно на @a_horse отговор (след обсъждане с OP в коментарите).
Работи с всички (сравнително краен) брой нива в рекурсията.

Обща цена за даден project_id

WITH RECURSIVE cte AS (
   SELECT project_id AS project_parent, project_value
   FROM   projects
   WHERE  project_id = 1 -- enter id of the base project here !

   UNION  ALL 
   SELECT p.project_id, p.project_value
   FROM   cte
   JOIN   projects p USING (project_parent)
)
SELECT sum(project_value) AS total_value
FROM   cte;

Обща цена за всички проекти

WITH RECURSIVE cte AS (
   SELECT project_id, project_id AS project_parent, project_value
   FROM   projects
   WHERE  project_parent IS NULL  -- all base projects

   UNION  ALL 
   SELECT c.project_id, p.project_id, p.project_value
   FROM   cte c
   JOIN   projects p USING (project_parent)
   )
SELECT project_id, sum(project_value) AS total_value
FROM   cte
GROUP  BY 1
ORDER  BY 1;

db<>fiddle тук (с правилен тест)
Стар sqlfiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. chmod og-rwx server.key в windows

  2. PostgreSQL - ГРУПИРАНЕ ПО стойности на клеймо за време?

  3. Принудително да се инсталира Postgres с кодиране UTF8, а не LATIN1?

  4. Грешка в базата данни на Postgres:връзката не съществува

  5. Премахване на COMMENT ON от всички обекти в PostgreSQL