Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 正在修复总余额查询_Sql_Sql Server_Northwind - Fatal编程技术网

Sql 正在修复总余额查询

Sql 正在修复总余额查询,sql,sql-server,northwind,Sql,Sql Server,Northwind,我的SQL查询有问题。我正在使用一个旧的Northwind数据库。 我需要写一个查询,它将显示国家之间的总余额,所有国家 到目前为止,我有这样的想法: SELECT MAX(ca.CountryName) as CountryA, MIN(cb.CountryName) as CountryB, SUM((case when ca.CountryName < cb.CountryName then -1 else 1 end) * CONVERT(money, (od.UnitPri

我的SQL查询有问题。我正在使用一个旧的Northwind数据库。 我需要写一个查询,它将显示国家之间的总余额,所有国家

到目前为止,我有这样的想法:

   SELECT
MAX(ca.CountryName) as CountryA,
MIN(cb.CountryName) as CountryB,
SUM((case when ca.CountryName < cb.CountryName then -1 else 1 end) * CONVERT(money, (od.UnitPrice * od.Quantity) * (1 - od.Discount) / 100) * 100) as Balance
FROM Orders o
INNER JOIN [Order Details] od on o.OrderID=od.OrderID
INNER JOIN Products p on p.ProductID = od.ProductID
INNER JOIN Suppliers s on s.SupplierID = p.SupplierID
INNER JOIN Customers c on o.CustomerID = c.CustomerID
INNER JOIN Countries ca ON ca.CountryID = s.CountryID
INNER JOIN Countries cb ON cb.CountryID = c.CountryID
WHERE NOT cb.CountryName = ca.CountryName
GROUP BY (case when ca.CountryName < cb.CountryName then ca.CountryName+' to '+cb.CountryName else cb.CountryName+' to '+ca.CountryName end)
ORDER BY CountryA, CountryB
我现在得到的结果是:

Australia   Sweden  -7626.86
Australia   Switzerland -7245.20
Australia   UK  -7672.98
Australia   USA -34848.87
Australia   Venezuela   -7953.09
Brazil  Austria 1216.80
Brazil  Belgium 54.00
Brazil  Mexico  -148.50
Brazil  Poland  -54.00
Brazil  Portugal    -36.00
我所期望的是,更接近这一点:

Australia   Sweden  -7626.86
Australia   Switzerland 7245.20
Australia   UK  -7672.98
Australia   USA 34848.87
Australia   Venezuela   7953.09
Brazil  Austria 1216.80
Brazil  Belgium 54.00
Brazil  Mexico  148.50
Brazil  Poland  -54.00
Brazil  Portugal    36.00
正确的值,只有在正确的情况下才减号,没有USA-USA-6000,没有双倍。

你的总和基本上是2部分的乘法,当ca.CountryName 然后,结果的符号将完全取决于条件ca.CountryName
为了给出一个合适的求和表达式以满足您的需要,我们需要查看底层数据,以了解如何构建此类表达式,以及您的业务逻辑,金额何时应显示为负数,何时显示为正数?

同时指定预期结果。@jarlh我已更新了帖子。不确定我是否解释正确。我需要数一数,每个国家从每个国家出售和购买了多少,以及它们是否在正负上。并不是每个国家都是生产者,也不是每个国家都是消费者。样本数据和期望的结果确实会有所帮助。按国家名称的相对顺序对变量求和不会让我想起现实世界中的问题,因此很难找出您真正想要实现的目标。@GordonLinoff很难提供它们,因为我不确定我现在掌握的数字是否正确。我添加了数据库的图表,可能会有所帮助。再次,解释一下我现在的情况:-拥有相应客户国的生产国列表以及它们之间的平衡。-余额是正确计算的,但如果CountryB按字母顺序高于CountryA,则余额始终为正值;如果CountryB低于CountryA,则余额始终为负值。我需要:-正确计算总平衡,按字母顺序,正确显示是否为正或负。嘿,谢谢你的帮助。这些信息证实了我的猜测。所以,为了创造一个正确的总数,我们需要计算CountryA生产了多少产品,他们向不同国家销售了多少产品,以及他们从其他国家购买了多少产品。当他们购买的数量大于他们生产的数量时,金额应为负值;当他们生产的数量大于他们购买的数量时,金额应为正值。您希望我提供的确切数据是什么?这是一个旧的Northwind数据库,所以我可以发送所有内容。而且,数字是正确的,所以求和表达式的第一部分需要一个fixFilter,用于您所在的WHERE中的country Australia vs USA,并删除所有GROUP BY和aggregate表达式,然后验证每列的数据,确保从澳大利亚到美国的最终金额不应为负值。我认为主要问题是,我的计算是基于ca.CountryNamecb.CountryName也可能是错误的。我检查了订单表中的订单,它显示没有到澳大利亚的订单,这意味着澳大利亚只是生产商,而不是客户。因此,澳大利亚的总数应该是正的。
Australia   Sweden  -7626.86
Australia   Switzerland 7245.20
Australia   UK  -7672.98
Australia   USA 34848.87
Australia   Venezuela   7953.09
Brazil  Austria 1216.80
Brazil  Belgium 54.00
Brazil  Mexico  148.50
Brazil  Poland  -54.00
Brazil  Portugal    36.00