2013-10-02 3 views
0

Спасибо за ответы на мой предыдущий вопрос. Я надеюсь, что все в порядке, но у меня теперь есть другой вопрос:Объединение 3 таблиц и группировка по максимальному значению столбца

Теперь меня попросили продлить то, что я делаю, чтобы включить конвертацию GrossCost, которая хранится в местной валюте, в базовую валюту GBP ,

У меня есть SQL для обеих частей по отдельности, но не знаю, как их объединить. Эти две части:

  1. Получить сумму GrossCost для каждой компании:

    Select Cast(ROW_NUMBER() OVER (ORDER BY Sum(JobCosting.PurchaseOrderItems.GrossCost) Desc) AS Int) As 'RowNum', Admin.Companies.UniqueName As 'UN', Sum(JobCosting.PurchaseOrderItems.GrossCost) As 'DonutValue' From Admin.Companies Inner Join JobCosting.PurchaseOrders On Admin.Companies.CompanyId = JobCosting.PurchaseOrders.SupplierCompanyId Inner Join JobCosting.PurchaseOrderItems On JobCosting.PurchaseOrders.PurchaseOrderId = JobCosting.PurchaseOrderItems.PurchaseOrderId Where UniqueName Like 'HH %' Group By UniqueName Order By 'DonutValue' Desc

  2. Получить Conversion курс валюты для каждой валюты. Конверсия - это GrossCost * Обменный курс для соответствующей валюты. Это Обменный курс SQL (предоставляемые SQLGRL - еще раз спасибо):

    SELECT * 
    FROM (SELECT CompanyId, UniqueName,CurrencyCode,ExchangeRate,FromCurrencyID, ToCurrencyId, ActiveDate, 
    rank() OVER 
    (partition BY UniqueName,Admin.Currencies.CurrencyId 
    ORDER BY ActiveDate DESC) AS Rank 
    FROM Admin.Companies 
    INNER JOIN Admin.Currencies 
    ON Admin.Companies.CurrencyId = Admin.Currencies.CurrencyId 
    INNER JOIN Admin.CurrencyRates 
    ON Admin.Currencies.CurrencyId = Admin.CurrencyRates.FromCurrencyId 
    WHERE Admin.CurrencyRates.ToCurrencyId = 47) ci 
    

    WHERE ci.Rank = 1

Что мне нужно сделать, это в конечном итоге с объединенным SQL, который получает все те же строки назад и вычисляет преобразованное значение суммы GrossSales для каждой компании.

Снова любая помощь была бы очень благодарна полученной, так как я действительно застрял.

Заранее спасибо

ответ

0

использовать что-то вроде этого -

WITH cte AS (
    SELECT c.*, --column_list 
    ROW_NUMBER(ORDER BY cur_from.ActiveDate desc) row_num 
    FROM Company c 
    INNER JOIN Currencies cu ON c.CurrencyId = cu.CurrencyId 
    INNER JOIN CurrencyRates cu_from ON cu.CurrencyId = cu_from.CurrencyFromId 
    -- WHERE CONDITION if any 
) 

SELECT * FROM cte WHERE row_num = 1 
0

Это даст вам самый текущий курс обмена для каждого кода валюты для каждой компании:

SELECT * 
    FROM (SELECT CompanyName,CurrencyCode,ExchangeRate3,ActiveDate, 
    rank() OVER 
    (partition BY CompanyName,dbo.Currencies.CurrencyId 
    ORDER BY ActiveDate DESC) AS Rank 
    FROM dbo.company 
    INNER JOIN dbo.Currencies 
    ON dbo.company.CurrencyId = dbo.Currencies.CurrencyId 
    INNER JOIN dbo.CurrencyRates 
    ON dbo.Currencies.CurrencyId = dbo.CurrencyRates.CurrencyFromId) ci 
WHERE  ci.Rank = 1 

EDIT включить дополнительную запрашиваемую информацию:

with cte as (
Select Cast(ROW_NUMBER() OVER 
(ORDER BY Sum(JobCosting.PurchaseOrderItems.GrossCost) Desc) AS Int) As 'RowNum', 
Admin.Companies.UniqueName As 'UN', 
Sum(JobCosting.PurchaseOrderItems.GrossCost) As 'DonutValue' 
From Admin.Companies 
Inner Join JobCosting.PurchaseOrders 
On Admin.Companies.CompanyId = JobCosting.PurchaseOrders.SupplierCompanyId 
Inner Join JobCosting.PurchaseOrderItems 
On JobCosting.PurchaseOrders.PurchaseOrderId =JobCosting.PurchaseOrderItems.PurchaseOrderId 
Where UniqueName Like 'HH %' Group By UniqueName Order By 'DonutValue' Desc 
) 

SELECT * 
FROM (SELECT CompanyId, UniqueName,CurrencyCode,ExchangeRate,FromCurrencyID, 
ToCurrencyId, ActiveDate, 
rank() OVER 
(partition BY UniqueName,Admin.Currencies.CurrencyId 
ORDER BY ActiveDate DESC) AS Rank 
FROM Admin.Companies 
INNER JOIN Admin.Currencies 
ON Admin.Companies.CurrencyId = Admin.Currencies.CurrencyId 
INNER JOIN Admin.CurrencyRates 
ON Admin.Currencies.CurrencyId = Admin.CurrencyRates.FromCurrencyId 
WHERE Admin.CurrencyRates.ToCurrencyId = 47) as ci 
INNER JOIN cte 
on cte.UN = ci.UniqueName 
where ci.Rank = 1; 

Это решение использует общее табличное выражение. Но вы можете добиться того же результата, создав представление и присоединив представление к ранжировочному запросу.

+0

Большое спасибо за это, это дает мне именно то, что мне нужно. – enCue

+0

Задача продлилась после вашей помощи, и я снова застрял. Любая помощь будет получена с благодарностью. – enCue

Смежные вопросы