2013-10-02 38 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. 獲取貨幣轉換率每種貨幣。轉換爲相關貨幣的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 

編輯包括要求的附加信息:

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