Sql server 连接3个表并按最大列值分组

Sql server 连接3个表并按最大列值分组,sql-server,Sql Server,谢谢你回答我之前的问题。我希望这样做没问题,但我现在有另一个相关问题: 我现在被要求扩展我正在做的工作,包括将以当地货币持有的格罗斯科斯特转换为英镑的基础货币 我分别拥有这两部分的SQL,但不知道如何组合它们。这两部分是: 获取每家公司的总成本: SELECT * FROM (SELECT CompanyName,CurrencyCode,ExchangeRate3,ActiveDate, rank() OVER (partition BY Company

谢谢你回答我之前的问题。我希望这样做没问题,但我现在有另一个相关问题:

我现在被要求扩展我正在做的工作,包括将以当地货币持有的格罗斯科斯特转换为英镑的基础货币

我分别拥有这两部分的SQL,但不知道如何组合它们。这两部分是:

  • 获取每家公司的总成本:

    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
    
    选择Cast(ROW_NUMBER()OVER(ORDER BY Sum(JobCosting.PurchaseOrderItems.GrossCost)Desc)作为Int)作为“RowNum”,
    Admin.companys.UniqueName为“UN”,
    总计(JobCosting.PurchaseOrderItems.GrossCost)为“DonutValue”
    来自管理公司
    Admin.companys.CompanyId上的内部联接JobCosting.PurchaseOrders=
    作业成本计算.采购订单.供应商公司ID
    内部联接JobCosting.PurchaseOrderItems
    关于JobCosting.PurchaseOrders.PurchaseOrderId=
    JobCosting.PurchaseOrderItems.PurchaseOrderId
    其中UniqueName像“HH%”
    按唯一名称分组
    按“DonutValue”说明订购

  • 获取每种货币的货币转换率。换算为相关货币的GrossCost*汇率。这是SQL的汇率(由SQLGRL提供-再次感谢):

    其中ci.Rank=1

  • 我需要做的是得到一个组合SQL,它返回所有相同的行,并计算每个公司的Grossales总和的转换值

    再说一次,任何帮助都会非常感激,因为我真的被卡住了


    提前感谢

    使用类似的方法-

    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
    

    这将为您提供每家公司每种货币代码的最新汇率:

    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;
    

    此解决方案使用公共表表达式。但是,通过创建视图并将视图加入排名查询,您也可以获得相同的结果。

    非常感谢,这正好满足了我的需要。在您的帮助下,挑战已经扩大,我再次陷入困境。任何帮助都将受到感激。