PosgreSQL: цикл по полям

176
23 ноября 2018, 08:50

Дана таблица с контрактами, необходимо для каждого contract.id просуммировать задолженность в таблице invoiceT. (Задолженность - когда invoice.payed = "false")
Записать результат в таблицу resT в виде: contract_id, amount

Вот мой псевдокод:

foreach contract in bill.contract contractT
loop
  foreach invoice in (select* from bill.invoice invoiceT
                  where invoiceT.id_contract = contract.id)
  sum = 0;
  loop
    if inv.payed = 'false' then
      sum := sum + inv.amount;
    end if;
  end loop;
  insert into debtorsT (id_contract, amount) values (contr.id, sum);
end loop;

Приму любой вариант реализации. Спасибо.

Answer 1

Возможно я не понял вашу задачу - но для чего вам вовсе циклы? Задача решается элементарным стандартным SQL

select id_contract, sum(amount)
from bill.invoice
where payed = 'false' -- если там text или enum, если bool - то напрямую not payed
group by id_contract

Всё, получили выборку со суммой всех неоплаченных инвойсов. Если надо куда-то записать в другую таблицу - есть замечательный синтаксис insert .. select ..:

insert into debtorsT (id_contract, amount)
select id_contract, sum(amount)
from bill.invoice
where payed = 'false' -- если там text или enum, если bool - то напрямую not payed
group by id_contract

Если нужны ещё и полностью оплаченные контракты то просто добавляется left join:

select id_contract, coalesce(notpayed, 0)
from bill.contract
left join (
select id_contract, sum(amount) as notpayed
from bill.invoice
where payed = 'false' -- если там text или enum, если bool - то напрямую not payed
group by id_contract
) np on id_contract = contract.id

Это стандартные возможности SQL и потому подойдут и для postgresql и для упомянутых на момент написания ответа в тегах sqlite и mysql.

READ ALSO
Как подключить python-скрипт к html в Django

Как подключить python-скрипт к html в Django

Работаю с DjangoИмеется главная страница написанная на html, на ней располагается кнопка

196
Нужно ли добавлять пагинацию в данной ситуации?

Нужно ли добавлять пагинацию в данной ситуации?

Есть файл indexhtml в него регулярно добавляются посты(статьи) подобного вида(через админку), только текст и ничего больше

180
Laravel кастомизация валидации

Laravel кастомизация валидации

Вопрос в следующем, как мне при выводе ошибки валидации указать свое название поля

174