2015-07-18 3 views
0

Использование SQL Server 2012ПРИСОЕДИНИТЕСЬ к двум таблицам для себя и вычислить значение на основе двух

У меня есть две таблицы, которые соединены.

[APXFirm].[AdvApp].[vMarketIndexRate] 

[APXFirm].[AdvApp].[vMarketIndex] 

Присоединение только эти два я могу получить IndexName, AsofDate и скорость

Однако я хочу, чтобы вычислить взвешенную сумму двух индексов. S & P500, взвешенный по 0,4 и ди-джею. Средний вес - 0,6. Я попробовал запрос ниже и получил результат, но это не смешанная ставка. Это первая скорость индексов.

Например, если на определенную дату SP = 100 и ди-джей = 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 
+0

Можете ли вы добавить пример данных и ожидаемый результат –

+0

Какой результат вы получаете? –

+0

Вы попробовали левое соединение вместо внутреннего соединения? – Spidey

ответ

1

Если я вас понял проблему правильно, проблема заключается в "от" блока - попробуйте использовать следующий:

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 
+0

Это работает. Похоже, я присоединился к слишком большому количеству полей. –

0

Вашей группу по неправильно:

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

Если вы группируете больше столбцов, чем выбрано, вы получите несколько строк для каждой из ваших предполагаемых групп (по одной для каждой комбинации столбцов, перечисленных в группе.