TotalSellPrice之和,按JobID分组?-初学者SQL问题

TotalSellPrice之和,按JobID分组?-初学者SQL问题,sql,sum,Sql,Sum,我想写一个查询,给出系统中每项工作的年初至今销售额。我们使用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"

我想写一个查询,给出系统中每项工作的年初至今销售额。我们使用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
选择C.Shortname作为“客户”,选择J.JobReference,(OH.TotalSellPrice-OH.NonSalesAmount)作为“TotalSellPrice”,选择CIL.Amount作为“合同发票”,选择CA.Address1,CA.City,CA.TaxAreaID,选择T.Name作为“税区”,选择CA.PostCode作为“邮政编码”,选择OH.DateTimeCreated,选择TotalSalesYTD,选择J.JobID,选择CA.CustomerAddressID,选择SaleType
来自dbo.CustomerAddress作为CA,带有(NOLOCK)
将TaxArea作为T左键与CA上的(NOLOCK)连接。TaxAreaID=T.TaxAreaID
将客户作为C与(NOLOCK)左键连接在CA.CustomerID=C.CustomerID上
在CA.CustomerAddressID=J.CustomerAddressID上将作业作为J与(NOLOCK)左连接
将CustomerFinancial作为CF与CA上的(NOLOCK)左连接。CustomerID=CF.CustomerID
在CA.CustomerAddressID=OH.DeliveryAddressID上将OrderHeader作为OH与(NOLOCK)左连接
左键连接constractinvoicingline作为CIL,在OH.constractinvoicingline=CIL.constractinvoicingline上使用(NOLOCK)
其中TotalSalesYTD 0和OH.DateTimeCreated>'2019-12-31'和OH.OrderStatus=8和OH.SaleType=3
按C.ShortName、JobReference排序
这将显示一个结果,其中每个作业引用针对该作业下的每个订单显示多次。我想把订单合并成每项工作的总额。例如,我希望蓝色列是一个单一的数字,只有3362.68+101.03+1642.86+1298.75


我的想法是将SUM(OH.TotalSellPrice-OH.NonSalesAmount)作为“TotalSellPrice”,但这不起作用,似乎是因为我的其他列不在函数中。我认为这可能是一个简单的问题,但我刚刚开始使用SQL。我已经收集到可以通过浏览这个站点来使用分区,但是我不知道如何将它应用到我当前的查询中。感谢您的帮助,谢谢

根据您在上面的评论中注意到的错误消息,我假设您正在使用SQL Server作为数据库设备

在SQL Server和大多数其他数据库中,当使用
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
选择
C.简称为“客户”
,J.JobReference
,总和(OH.TotalSellPrice-OH.NonSalesAmount)为“TotalSellPrice”
,CIL.金额为“合同发票”
,CA.Address1
,加利福尼亚州城市
,约红豆杉
,T.名称为“税区”
,CA.邮政编码为“邮政编码”
,哦,DateTimeCreated
,TotalSalesYTD
,J.JobID
,CA.CustomerAddressID
,C.CustomerID
,SaleType
来自dbo.CustomerAddress作为CA
左连接区域为T
关于CA.TaxAreaID=T.TaxAreaID
左加入客户为C
在CA.CustomerID=C.CustomerID上
左加入工作为J
在CA.CustomerAddressID=J.CustomerAddressID上
左连接客户财务作为CF
在CA.CustomerID=CF.CustomerID上
左连接OrderHeader为OH
在CA.CustomerAddressID=OH.DeliveryAddressID上
左连接收缩沃辛格林作为CIL
关于OH.constractinvoicinglineid=CIL.constractinvoicinglineid
其中TotalSalesYTD为0
哦,DateTimeCreated>'2019-12-31'
噢,OrderStatus=8
噢,SaleType=3
分组
C.简称
,J.JobReference
,CIL.Amount
,CA.Address1
,加利福尼亚州城市
,约红豆杉
,T.Name
,CA.邮政编码
,哦,DateTimeCreated
,TotalSalesYTD
,J.JobID
,CA.CustomerAddressID
,C.CustomerID
,SaleType
订购人
C.短名
,工作参考
另外,看看这些,然后做出明智的决定


样本数据、所需结果和适当的数据库标记都会有所帮助。此外,简化查询也有助于其他人。您是否在
求和
尝试中使用了
GROUP BY
子句?@EricBrandt Hey Eric,当我在查询末尾添加“GROUP BY J.JobID”时,出现以下错误:“列'Customer.ShortName'在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。”。“嘿,埃里克,非常感谢。这个问题部分地回答了我的问题。另一部分是:假设我有Jobid29923和54630。29923有两个订单,其中一个订单的TotalSellPrice为16.00,另一个订单的TotalSellPrice为9.00。我希望我的查询显示作业ID:29923 TotalSellPrice:23.00。我将对NOLOCK进行研究,感谢您提供。@AveryWilson,您的查询中没有任何内容表明“订单”是什么,因为您在评论中使用了该词。但是,一般来说,如果要按不想按其分组的属性(列)进行分组,则需要将该属性从“选择”列表中删除,或将其封装在聚合函数中,如
MAX
MIN
。Eric-我再也看不到图像了-但如果可以,可以看到每个颜色方块的图像,右边有一个“JobID”。该作业ID适用于所有这些“订单”(很抱歉使用该词,在本例中,订单只是一行。因此,蓝色部分有4个“订单”,黄色部分有1个)。但是,在该JobID中,有4个不同的“TotalSellPrice”数字(例如:第一个订单的价格为3362.68美元)。我想要的是根据JobID将所有这些数字加在一行下。因此,JobID应该是该ID中所有行的总和。但问题是,查询中的哪一列导致每个
JobID
有多行?一旦美元金额相加,所有
JobID
值的所有未模糊列都是相同的。这不是我要说的。您的目标应该是理解您的数据和SQL,以便您能够以一种可靠地返回所需结果的方式编写查询。这可能意味着使查询更复杂,或者更简单,但在处理数据时您会发现这一点。