我的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
结果我马上就到了:
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,没有双打。
答案 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
位于比较国家/地区的所有其他字母之前,A
对Brazil
和Austria
具有负值因为它Belgium
对Br
和A
。
要提供符合您需求的正确Be
表达式,我们需要查看基础数据,以了解如何构建此类表达式和业务逻辑(何时应将数量显示为负数,何时显示为正数?)