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
如果您分组的列多于所选的列,您将获得每个预期分组的多行(分组依据中列出的列的每个组合各有一行。
使用 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
如果您分组的列多于所选的列,您将获得每个预期分组的多行(分组依据中列出的列的每个组合各有一行。