JOIN 两个 table 并根据两者计算一个值

JOIN two table to themselves and calculate a value based on the two

使用 SQL 服务器 2012

我有两个连接的表。

[APXFirm].[AdvApp].[vMarketIndexRate]

[APXFirm].[AdvApp].[vMarketIndex]

加入这两个我就能得到 IndexName、AsofDate 和 Rate

不过我想计算两个指标的加权和。标准普尔 500 指数的权重为 0.4,道琼斯平均指数的权重为 0.6。我尝试了下面的查询并得到了结果,但它不是混合率。这是第一个指标率。

例如,如果在给定日期 SP = 100 且 DJ = 200,则混合率应为 40 + 120 = 160

这是我的查询

USE APXFIRM
SELECT 'Blend' AS 'IndexName', ir1.AsOfDate,

  SUM(ir1.rate*.4+ir2.rate*.6) AS 'blendrate'
  FROM [APXFirm].[AdvApp].[vMarketIndexRate] IR1
   INNER JOIN [APXFirm].[AdvApp].[vMarketIndex] MI1
    ON IR1.indexid = mi1.indexid 
    INNER JOIN [APXFirm].[AdvApp].[vMarketIndexRate] IR2
    ON ir2.indexid = ir1.indexid AND ir2.asofdate = ir1.asofdate
    INNER JOIN [APXFirm].[AdvApp].[vMarketIndex] MI2
    ON ir2.indexid = ir1.indexid AND ir2.asofdate = ir1.asofdate
  WHERE mi1.indexname = 'sp'
  AND  mi2.indexname = 'djind'
  GROUP BY MI1.IndexName ,
           IR1.AsOfDate ,
           IR1.Rate ,
           MI2.IndexName ,
           IR2.AsOfDate ,
           IR2.Rate

这是所有数据的示例。请注意,重量不是实际的列。我只是出于说明目的将其包括在内。

IndexName   AsOfDate    rate    weight  IndexName   AsOfDate    rate    weight  BlendRate
SP500   12/31/2012      100        0.6  DowJones    12/31/2012  90      0.4     96
SP500   1/31/2013       110        0.6  DowJones    1/31/2013   95      0.4     104
SP500   2/28/2013       120        0.6  DowJones    2/28/2013   100     0.4     112
SP500   3/31/2013       130        0.6  DowJones    3/31/2013   110     0.4     122

这是所需的输出。

IndexName   AsOfDate    BlendRate
Blend   12/31/2012      96
Blend   1/31/2013       104
Blend   2/28/2013       112
Blend   3/31/2013       122

如果我理解你的问题是对的,那么问题出在 "from" 块中 - 尝试使用下一个:

SELECT 'Blend' AS 'IndexName'
      ,ir1.AsOfDate
      ,SUM(ir1.rate*.4+ir2.rate*.6) AS 'blendrate'

FROM [APXFirm].[AdvApp].[vMarketIndexRate] IR1
     INNER JOIN [APXFirm].[AdvApp].[vMarketIndex] MI1
             ON IR1.indexid = mi1.indexid 
     INNER JOIN [APXFirm].[AdvApp].[vMarketIndexRate] IR2
             ON ir2.asofdate = ir1.asofdate
     INNER JOIN [APXFirm].[AdvApp].[vMarketIndex] MI2
             ON ir2.indexid = mi2.indexid

WHERE mi1.indexname = 'sp'
  AND mi2.indexname = 'djind'

GROUP BY MI1.IndexName
        ,IR1.AsOfDate
        ,IR1.Rate
        ,MI2.IndexName
        ,IR2.AsOfDate
        ,IR2.Rate

您的分组依据不正确:

SELECT
    'Blend' AS 'IndexName',
    ir1.AsOfDate,
    SUM(ir1.rate*.4+ir2.rate*.6) AS 'blendrate'
FROM ...
...
GROUP BY 1, 2

如果您分组的列多于所选的列,您将获得每个预期分组的多行(分组依据中列出的列的每个组合各有一行。