Торговый баланс между странами - база данных Northwind - PullRequest
0 голосов
/ 25 апреля 2018

У меня довольно сложная задача, используя старую базу данных Northwind, мне нужно создать торговый баланс для каждой страны.Что означает, мне нужно посчитать, сколько каждая страна продала каждой стране, сколько они купили и каков баланс, плюс или минус.У меня есть таблица Countries со столбцами 'CountryID, CountryName, ContinentID'.Я бы предпочел, чтобы страны назывались по их первоначальному названию, а не CountryID.

. У меня есть таблица Suppliers с такими столбцами, как SupplierID с соответствующими CountryId.То же самое касается Customers таблицы, CustomerID и CountryId.

Пока у меня есть это:

SELECT c.CountryID, SUM(CONVERT(money, (od.UnitPrice * od.Quantity) * (1 - od.Discount) / 100) * 100) AS ProductSales
From Countries c
LEFT OUTER JOIN Suppliers s ON c.CountryID = s.CountryID
JOIN Customers cu ON c.CountryID = cu.CountryID
JOIN Products p ON s.SupplierID = p.SupplierID
JOIN Orders o ON cu.CustomerID = o.CustomerID
JOIN [Order Details] od ON o.OrderID = od.OrderID
GROUP BY c.CountryID

РЕЗУЛЬТАТЫ:

9   2072561.58
6   65322.04
7   56430.15
4   106925.77
19  412799.24
13  17205.45
5   200785.20
16  35966.40
17  272475.70
11  78850.80
20  2947015.56
8   406791.55

Iне думаю, что это дает мне что-то близкое к тому, что мне нужно, вероятно, это только стоимость всех проданных продуктовЯ застрял с этой задачей, я предоставлю любую необходимую информацию.

1 Ответ

0 голосов
/ 25 апреля 2018

Это будет выглядеть так, как показано ниже (Извините, у меня нет этой БД, установленной на моем локальном компьютере).Может быть, это поможет -

select
    fc.Countryname as FromCountryName,
    tc.Countryname as ToCountryName,
    SUM(CONVERT(money, (od.UnitPrice * od.Quantity) * (1 - od.Discount) / 100) * 100)
from Suppliers as s
inner join Countries as fc on fc.id = s.countryid
inner join Products as p on p.supplierid = s.id
inner join [Order Details] as od on od.productid = p.id
inner join Orders as o on o.id = od.OrderId
inner join Customers as cu on cu.id = o.customerId
inner join Countries as tc on tc.id = cu.countryid
group by fc.Countryname, tc.Countryname

У нас есть Group By данные для FromCountry и ToCountry.

Для второго требования согласно комментариям ниже (Возможно, запрос ниже не эффективен)с точки зрения производительности) -

select
    max(fc.name) as CountryA,
    min(tc.name) as CountryB,
    BalanceAB = sum(case when fc.name > tc.name then (CONVERT(money, (od.UnitPrice * od.Quantity) * (1 - od.Discount) / 100) * 100) end),
    BalanceBA = sum(case when fc.name < tc.name then (CONVERT(money, (od.UnitPrice * od.Quantity) * (1 - od.Discount) / 100) * 100) end),
    SUM((case when fc.name < tc.name then -1 else 1 end) * CONVERT(money, (od.UnitPrice * od.Quantity) * (1 - od.Discount) / 100) * 100) as [Total(A - B)]
from @Supplier as s
inner join @Country as fc on fc.id = s.countryid
inner join @Product as p on p.supplierid = s.id
inner join @OrderDetail as od on od.productid = p.id
inner join @Order as o on o.id = od.OrderId
inner join @Customer as cu on cu.id = o.customerId
inner join @Country as tc on tc.id = cu.countryid
group by (case when fc.name < tc.name then fc.name+' to '+tc.name else tc.name+' to '+fc.name end)

Выход -

CountryA    CountryB    BalanceAB   BalanceBA   Total(A - B)
US          UK          20.00       200.00      -180.00
...