修复总余额查询

时间:2018-05-04 10:24:42

标签: 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.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

经过几次检查后,我发现了一些错误,导致我无法完成这项工作。 CountryA按字母顺序排列的国家总是负平衡。我在SUM(...)行中犯了一个错误,但我不确定如何修复它? 如何更改此查询,这将显示各国之间的正确余额?

  

国家A - 国家B ---(交易总额A-> B和B-> A)

我正在使用的数据库图,另外还有两个自定义表。

Country
CountryID, CountryName, ContinentID
Continents
ContinentID, ContinentName

enter image description here

结果我马上就到了:

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

正确的值,只有当它合理时才减去,没有美国 - 美国 - 6000,没有双打。

1 个答案:

答案 0 :(得分:1)

你的status基本上是2个部分的乘法,一个1或-1(SUM)的整数,以及似乎始终为正(case when ca.CountryName < cb.CountryName then -1 else 1 end)的数量。

结果的符号将完全取决于条件CONVERT(money, (od.UnitPrice * od.Quantity) * (1 - od.Discount) / 100) * 100,该条件是每个国家/地区的ca.CountryName < cb.CountryName名称的比较。这就是为什么国家/地区VARCHAR所有结果都是否定的,因为Australia位于比较国家/地区的所有其他字母之前,ABrazilAustria具有负值因为它BelgiumBrA

要提供符合您需求的正确Be表达式,我们需要查看基础数据,以了解如何构建此类表达式和业务逻辑(何时应将数量显示为负数,何时显示为正数?)