Фиксация запроса общего баланса - PullRequest
0 голосов
/ 04 мая 2018

У меня проблемы с моим запросом 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 голосов
/ 04 мая 2018

Ваше SUM - это, по сути, умножение на 2 части, целое число, равное 1 или -1 (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.

Чтобы дать правильное выражение SUM, соответствующее вашим потребностям, нам нужно увидеть базовые данные, чтобы знать, как построить такое выражение и вашу бизнес-логику (когда сумма должна быть показана как отрицательная, а когда - как положительная?).

...