Я написал небольшое заявление, чтобы помочь мне и моим соседям управлять тем, кто кому должен деньги. Люди вводят свои долги (например, платежи за еженедельные покупки) в веб-интерфейс, и он регистрируется в базе данных.
База данных содержит 3 таблицы:
User { Name, Id }
Expenditure { Pennies, Id, Payer (User.Id) }
Debt { Expenditure (Expenditure.Id), User (User.Id) }
Таким образом, задолженность от человека перед лицом заносится в строку «расходы» с идентификатором кредитора и в таблицу долга для каждого «должника». Еженедельный магазин вводит одну строку в расходы, а затем все четыре соседа по дому в качестве должников в 4 отдельных рядах (в этом случае 1 человек указывается как кредитор и должник). Сумма, которую каждый человек должен за определенные расходы, представляет собой общую сумму расходов, поделенную на количество должников, которые ее оплачивают (т. Е. Количество раз, на которое оно ссылается в таблице долгов)
Надеюсь, это имеет смысл!
Моя проблема - написать немного SQL, чтобы вычислить, кто кому должен. Я хочу написать запрос, который рассчитывает общий долг от человека к человеку, для этого необходимо получить все расходы, которые относятся к кредитору, и все долги, которые относятся к должнику, и (жизненно важно) это необходимо для суммирования копеек всех расходов, разделенных по количеству долгов, которые на него ссылаются.
Затем я могу рассчитать общую сумму непогашенной задолженности просто:
Debt(A, B) - Debt(B, A)
На данный момент у меня есть этот SQL:
SELECT
SUM("Pennies") / (SELECT COUNT(*) FROM public."Debt", public."Expenditure" WHERE public."Expenditure"."Id" = public."Debt"."Expenditure") As "Refs"
FROM
public."Debt",
public."Expenditure"
WHERE
public."Debt"."User" = $debtorId
AND
public."Expenditure"."Payer" = $lenderId
AND
public."Expenditure"."Id" = public."Debt"."Expenditure"
что выглядит правильно, но когда я добавляю значения вручную, я получаю разные числа.
РЕДАКТИРОВАТЬ :: В ответ на один из ответов ниже. У меня отображается количество отображаемых акций, но всегда отображается 1: (
SELECT
shares
FROM
public."Debt",
public."Expenditure",
(SELECT COUNT(*) as "shares", public."Expenditure"."Id" as "Id" FROM public."Expenditure" GROUP BY public."Expenditure"."Id") as "debtors"
WHERE
public."Debt"."User" = 4
AND
public."Expenditure"."Payer" = 1
AND
public."Expenditure"."Id" = public."Debt"."Expenditure"
AND
"debtors"."Id" = public."Debt"."Expenditure"