СУММА TotalSellPrice, сгруппированная по JobID? - Новичок SQL Вопрос - PullRequest
1 голос
/ 14 февраля 2020

Я собираюсь написать запрос, который дает данные о продажах с начала года для каждой работы в нашей системе. Мы используем Bistrack. Вот что у меня есть:

select C.Shortname AS "Customer", J.JobReference, (OH.TotalSellPrice - OH.NonSalesAmount) AS "TotalSellPrice", CIL.Amount AS "Contract Invoice", CA.Address1, CA.City, CA.TaxAreaID, T.Name AS "Tax Area", CA.PostCode AS "ZIP Code", OH.DateTimeCreated, TotalSalesYTD, J.JobID, CA.CustomerAddressID, C.CustomerID, SaleType
from dbo.CustomerAddress AS CA WITH(NOLOCK)
left join TaxArea AS T WITH(NOLOCK) ON CA.TaxAreaID = T.TaxAreaID
left join Customer as C WITH(NOLOCK) ON CA.CustomerID = C.CustomerID
left join Job as J WITH(NOLOCK) ON CA.CustomerAddressID = J.CustomerAddressID
left join CustomerFinancial as CF WITH(NOLOCK) ON CA.CustomerID = CF.CustomerID
left join OrderHeader AS OH WITH(NOLOCK) ON CA.CustomerAddressID = OH.DeliveryAddressID
left join ContractInvoicingLine AS CIL WITH(NOLOCK) ON OH.ContractInvoicingLineID = CIL.ContractInvoicingLineID 
WHERE TotalSalesYTD <> 0 AND OH.DateTimeCreated > '2019-12-31' AND OH.OrderStatus = 8 AND OH.SaleType = 3
ORDER BY C.ShortName, JobReference

Это отображает результат, в котором каждая ссылка на работу показывается несколько раз для каждого заказа под этой работой. Я хотел бы объединить заказы в СУММУ для каждой работы. Так, например, я хочу, чтобы синий столбец представлял собой одно число, равное 3362,68 + 101,03 + 1642,86 + 1298,75.

Example

Моя идея состоит в том, чтобы сделать SUM (OH .TotalSellPrice - OH.NonSalesAmount) AS "TotalSellPrice", но это не работает, по-видимому, потому что другие мои столбцы не находятся в функции. Я думаю, что это может быть что-то простое исправить, но я только начал в SQL. Я понял, что разделение можно использовать при просмотре этого сайта, но я не знаю, как применить его к моему текущему запросу. Любая помощь приветствуется, спасибо!

1 Ответ

2 голосов
/ 14 февраля 2020

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

На SQL Сервере и большинстве других баз данных, когда вы используете SUM или любые другие агрегатные функции, вам необходимо добавить предложение GROUP BY, включающее все неагрегированные столбцы из SELECT пункт запроса.

SELECT 
   C.Shortname AS "Customer"
    ,J.JobReference
    ,SUM(OH.TotalSellPrice - OH.NonSalesAmount) AS "TotalSellPrice"
    ,CIL.Amount AS "Contract Invoice"
    ,CA.Address1
    ,CA.City
    ,CA.TaxAreaID
    ,T.Name AS "Tax Area"
    ,CA.PostCode AS "ZIP Code"
    ,OH.DateTimeCreated
    ,TotalSalesYTD
    ,J.JobID
    ,CA.CustomerAddressID
    ,C.CustomerID
    ,SaleType
FROM dbo.CustomerAddress AS CA 
LEFT JOIN TaxArea AS T 
  ON CA.TaxAreaID = T.TaxAreaID
LEFT JOIN Customer AS C  
  ON CA.CustomerID = C.CustomerID
LEFT JOIN Job AS J  
  ON CA.CustomerAddressID = J.CustomerAddressID
LEFT JOIN CustomerFinancial AS CF  
  ON CA.CustomerID = CF.CustomerID
LEFT JOIN OrderHeader AS OH  
  ON CA.CustomerAddressID = OH.DeliveryAddressID
LEFT JOIN ContractInvoicingLine AS CIL  
  ON OH.ContractInvoicingLineID = CIL.ContractInvoicingLineID
WHERE TotalSalesYTD <> 0
    AND OH.DateTimeCreated > '2019-12-31'
    AND OH.OrderStatus = 8
    AND OH.SaleType = 3
GROUP BY
   C.Shortname
    ,J.JobReference
    ,CIL.Amount
    ,CA.Address1
    ,CA.City
    ,CA.TaxAreaID
    ,T.Name
    ,CA.PostCode
    ,OH.DateTimeCreated
    ,TotalSalesYTD
    ,J.JobID
    ,CA.CustomerAddressID
    ,C.CustomerID
    ,SaleType
ORDER BY 
   C.ShortName
    ,JobReference

Плюс, посмотрите на них, а затем принимайте обоснованные решения.

Вредные привычки: везде положить NOLOCK

Всегда ли NOLOCK - правильный выбор?

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