Помоги мне!Мой SQL не работает :( - PullRequest
0 голосов
/ 07 декабря 2010

Я написал небольшое заявление, чтобы помочь мне и моим соседям управлять тем, кто кому должен деньги. Люди вводят свои долги (например, платежи за еженедельные покупки) в веб-интерфейс, и он регистрируется в базе данных.

База данных содержит 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"

Ответы [ 2 ]

1 голос
/ 07 декабря 2010

Дважды проверьте SQL, который у вас есть для расчета количества людей, имеющих задолженность - ваш текущий код вычисляет общее количество долей, причитающихся на всех долгов в системе.

Этот суб-выбор, вероятно, должен быть перемещен в секцию FROM

(SELECT Debt.Id , COUNT(*) as shares FROM Debt INNER JOIN Expenditure on Debt.Expenditure=Expenditure.Id GROUP BY Debt.Id) as debtors

и добавьте предложение where -

AND debtors.Id = Expenditure.Id

Тогда вы можете

SELECT SUM(Pennies/shares) ...
0 голосов
/ 07 декабря 2010

Я не понимаю часть, «разделенную на количество долгов, которые ссылаются на него». То, что вы на самом деле делаете, это деление на общее количество отделов в вашей базе данных (при условии, что у них всех есть расходы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...