#sql #sql-server #sql-server-2012
#sql #sql-сервер #sql-server-2012
Вопрос:
Проблема в том, что у меня есть две таблицы, и мне нужно рассчитать общий доход, который я вычислил, но не могу понять, как применить условие. Моя попытка сделать это ниже. Спасибо!
SELECT
(((SUM(i.ItemCost)) ((SUM(i.ItemCost)) * j.MarginPercentage)) WHERE j.WorkFlowsStatus = 'Closed')
FROM Jobs AS j
INNER JOIN Items AS i
ON j.JobNumber = i.JobNumber
INNER JOIN Customers as c
ON j.CustomerID = c.CustomerID
WHERE c.CustomerID = '1235735'
GROUP BY c.CustomerName;
Комментарии:
1. можете ли вы предоставить формулу
Ответ №1:
Мне нравится сначала выполнять вычисления, а затем суммировать значения. Запрос без суммы предоставляет вам подробную информацию для каждой строки, и вы можете увидеть подробную информацию о значениях, которые вы добавляете для каждой строки, просто убрав группировку.
SELECT
SUM(CASE
WHEN j.WorkFlowsStatus = 'Closed' THEN i.ItemCost * j.MarginPercentage i.ItemCost
ELSE i.ItemCost
END)
FROM Jobs AS j
INNER JOIN Items AS i ON j.JobNumber = i.JobNumber
INNER JOIN Customers as c ON j.CustomerID = c.CustomerID
WHERE c.CustomerID = '1235735'
Если вы получаете значение, которое считаете неправильным, просто выньте SUM()
и оставьте CASE
и добавьте ‘*’, и вы сможете просмотреть все подробные записи и выяснить, что происходит не так.
Когда вы просто суммируете все записи, вам не нужна group by. Если вы используете group by, все поля, которых нет в агрегатной функции, должны быть в списке group by. Поскольку вы выполняете запрос к определенному CustomerID
, вы знаете, что вы должны получить. Если бы вы этого не делали, группировка по имени клиента была бы рискованной, подумайте о том, что произошло бы, если бы две строки customer в конечном итоге имели одинаковое имя.
Ответ №2:
Я подозреваю, что вы хотите что-то вроде этого:
SELECT (SUM(i.ItemCost)
SUM(i.ItemCost * (CASE WHEN j.WorkFlowsStatus = 'Closed' THEN j.MarginPercentage ELSE 0 END))
)
FROM Jobs j INNER JOIN
Items i
ON j.JobNumber = i.JobNumber INNER JOIN
Customers as c
ON j.CustomerID = c.CustomerID
WHERE c.CustomerID = '1235735'
GROUP BY c.CustomerName;