Как выполнить условное умножение в SQL

#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;