SQL正在尝试查找总权重

SQL正在尝试查找总权重,sql,sql-server,Sql,Sql Server,代码段数据结果文本格式: 我目前被困在这个实践问题上,在特定年份以千克为单位计算总重量。仅获取具有未知发货方式的订单。我稍微编辑了您的查询,以便它生成预期结果。你可以用这个 Select Round(sum(coalesce(p.[Weight],0)),2) As Total_wt From SalesLT.SalesOrderHeader soh JOIN SalesLT.SalesOrderDetail sod on sod.SalesOrderID = soh.SalesOrderID

代码段数据结果文本格式:


我目前被困在这个实践问题上,在特定年份以千克为单位计算总重量。仅获取具有未知发货方式的订单。

我稍微编辑了您的查询,以便它生成预期结果。你可以用这个

Select Round(sum(coalesce(p.[Weight],0)),2) As Total_wt
From SalesLT.SalesOrderHeader soh
JOIN SalesLT.SalesOrderDetail sod on sod.SalesOrderID = soh.SalesOrderID
JOIN SalesLT.Product p on p.ProductID = sod.ProductID
where DatePART(year, soh.DueDate)=2017 and DatePART(month, soh.DueDate) IN (04,07,11)
and soh.shipmethod = ‘Unknown';

两个问题,一个小问题,一个大问题。次要:DATEPART返回一个int,因此最好使用
DATEPART(year,soh.DueDate)=2017来避免隐式转换。而且,这不是可搜索的,这意味着它不能使用索引来获得更好的性能。主要:订单有大量的项目。您只是对每种类型项的权重求和。显示数据结构的图表已在编辑中删除。但是在SalesOrderDetail中有一个“数量”字段,重量在Product表中。但是OP有这个问题,无论如何都要由他们来解决。他们可能也想考虑重量单位是什么…根据结果(重量以千计),我猜它们的单位是克而不是公斤,除非是集装箱运输公司。他们还需要决定如何处理空值。这一点很好。编辑了上面的Datepart筛选器。另外,我编辑了问题中的查询,不再看到数据模型图,因此不会对此进行更新。@seanb-我知道您有一些好的观点。然而,既然答案被接受了,我想它对提问者是有效的。让我们结束关于这个主题的讨论。我们总是可以在聊天中澄清和讨论更多。是的,对不起,结果很残酷。你的答案回答了OP的问题,并使用了基于他们的代码(这就是为什么我不再做我的答案——你的答案回答了基本问题)。然而,我的评论(除了隐含的转换/可攻击性点)更多的是让OP思考,而不是批评你的答案:如果OP想用答案作为他们的最终答案,它可能有更多的问题(他们没有问)。为了推广这种方法,我还想让OP了解
GROUP BY
。请不要对问题进行编辑,以免在收到答案后使其变得毫无意义。它需要继续对所有未来看到它的人有意义。
Select Round(sum(coalesce(p.[Weight],0)),2) As Total_wt
From SalesLT.SalesOrderHeader soh
JOIN SalesLT.SalesOrderDetail sod on sod.SalesOrderID = soh.SalesOrderID
JOIN SalesLT.Product p on p.ProductID = sod.ProductID
where DatePART(year, soh.DueDate)=2017 and DatePART(month, soh.DueDate) IN (04,07,11)
and soh.shipmethod = ‘Unknown';