В моей базе данных есть таблица: Job
. Каждое задание может содержать задачи (один для многих) - и одна и та же задача может быть повторно использована для нескольких заданий. Поэтому существует таблица Task
и JobTask
(таблица соединений для отношения «многие ко многим»). Существует также таблица Payment
, в которой записаны полученные платежи (с помощью столбца JobId
для отслеживания того, к какой задаче относится оплата). Потенциально может быть больше одного платежа, приписываемого заданию.Запрос SUM значения из объединенной таблицы - возвращает умноженный результат
Использование SQL Server 2012, у меня есть запрос, который возвращает краткое описание рабочих мест (общая стоимость работы, общая сумма полученных):
select j.JobId,
sum(t.Rate) as [TotalOwedP],
sum(p.Amount) as [TotalReceivedP]
from Job j
left outer join Payment p on j.JobId=p.JobId
left outer join JobTask jt on j.JobId=jt.JobId
left outer join Task t on jt.TaskId=t.TaskId
group by j.JobId
Проблема с этим запросом является то, что это возвращение гораздо более высокую сумму за «общее количество», чем должно быть. Здесь должно быть что-то, что мне не хватает, чтобы вызвать это.
В моей тестовой базе данных у меня есть одна работа. Это задание назначено на шесть задач. Он также имеет один платеж, назначенный ему (100 фунтов стерлингов - хранится как 10000
).
Используя приведенный выше запрос по этим данным, столбец TotalReceivedP
относится к 60000
, а не 10000
. Кажется, это умножает сумму платежа для каждой задачи, назначенной заданию. Ло, и вот, если я добавлю еще одну задачу на это задание (поэтому число задач теперь равно 7), столбец TotalReceivedP
показывает 70000
.
В моем запросе есть определенная проблема, но я просто не могу понять, что это такое. Любые острые глаза способны это заметить? Кажется, что-то не так с соединением.
Это будет работать отлично, но, к сожалению, 'max (p.Amount)' не может использоваться, поскольку может быть назначено несколько платежей на одну работу. Вид боли. –
@Teifi Если это так, то какой из этих выплат вы хотите суммировать с вашим запросом? Все они, только один? Если один, то какой? –
Это должно быть сумма всех сумм платежей с соответствующим «JobId». Я думал, что «левое внешнее соединение Payment p на j.JobId = p.JobId' решит это, но, по-видимому, нет. –