2013-11-15 4 views
0

У меня есть веб-сайт, который отслеживает инвестиции в паевые инвестиционные фонды. для этого у меня есть ниже структуры таблицы (структура была изменена, чтобы удалить ненужные столбцы таким образом, чтобы принести внимание на мою проблему)нужна помощь оптимизированный запрос sql

таблица № 1: scheme_Mst

|Scheme_ID | fundHouse_Id | OpeningBalance | OpeningUnits 
---------------------------------------------------------- 
|1   | 1   | 100   | 10 

Таблица № 2 инвестиции

|Scheme_ID | InvestedAmt | InvestedUnits | statusFlag 
---------------------------------------------------------- 
|1   | 50   | 5   | A 

Таблица № 3 погашения

|Scheme_ID | redemedAmt | redemedUnits | statusFlag 
---------------------------------------------------------- 
|1   | 50   | 5   | A 

Таблица № 4 SwitchDetails

|From_Scheme_ID |To_Scheme_ID |switchInAmt |switchInUnits |switchOutAmt |switchOutUnits | StaFlag 
------------------------------------------------------------------------------------------ 
|1    | 2   | 20   | 2   | 10   | 1    | A 

Таблица # 5 BonusDetails

|Scheme_ID | BonusAmt | BonusUnits | statusFlag 
---------------------------------------------------------- 
|1   | 50   | 5   | A 

Таблица # 6 Divident_Detais

|Scheme_ID | DividentAmt | DividentUnits | statusFlag 
---------------------------------------------------------- 
|1   | 50   | 5   | A 

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

SELECT *, 
     CASE 
      WHEN OutstandingUnits <> 0 THEN CONVERT(decimal(18,2),Outstanding/OutstandingUnits) 
      ELSE 0 
     END AS WAC 
FROM 
    (SELECT *, 
      ISNULL(OpeningBalance,0) + ISNULL(DividendAmount,0) + ISNULL(bonusAmount,0) + ISNULL(invstAmount,0) + ISNULL(SwitchedInAmount,0) - ISNULL(redeemedAmount,0) - ISNULL(SwitchedOutAmount,0) AS Outstanding, 
      ISNULL(openingUnits,0) + ISNULL(DividendUnits,0) + ISNULL(bonusUnits,0) + ISNULL(invstUnits,0) + SNULL(SwitchedInUnits,0) - ISNULL(redeemedUnits,0) - ISNULL(SwitchedOutUnits,0) AS OutstandingUnits 
    FROM 
    (SELECT C.scheme_ID,D.schemeName, D.Openingbalance AS OpeningBalance, D.OpeningUnits AS openingUnits, ISNULL(SUM(C.invstAmount),0) AS invstAmount, ISNULL(SUM(C.invstUnits),0) AS invstUnits, 
     (SELECT ISNULL(SUM(redemedAmt),0) 
     FROM redemption 
     WHERE StatusFlag='A' 
      AND scheme_ID = C.scheme_ID) AS redeemedAmount, 
     (SELECT ISNULL(SUM(redeemedUnits),0) 
     FROM redemption 
     WHERE StatusFlag='A' 
      AND scheme_ID = C.scheme_ID) AS redeemedUnits, 
     (SELECT ISNULL(sum(switchOutAmt),0) 
     FROM SwitchDetails 
     WHERE BB.Status = 'A' 
      AND BB.From_Scheme_Id = C.scheme_ID) AS SwitchedOutAmount, 
     (SELECT ISNULL(sum(switchOutUnits),0) 
     FROM SwitchDetails 
     WHERE BB.Status = 'A' 
      AND BB.From_Scheme_Id = C.scheme_ID) AS SwitchedOutUnits, 
     (SELECT ISNULL(sum(switchOutAmt),0) 
     FROM SwitchDetails 
     WHERE BB.Status = 'A' 
      AND BB.From_Scheme_Id = C.scheme_ID) AS SwitchedInAmount, 
     (SELECT ISNULL(sum(SwitchedInUnits),0) 
     FROM SwitchDetails 
     WHERE BB.Status = 'A' 
      AND BB.From_Scheme_Id = C.scheme_ID) AS SwitchedInUnits, .. same way 
     FOR bonus 
     AND divident .. 
     FROM Investment c) tab)tab2 

Этот запрос должен производить ниже выходной .. (образец выход)

Scheme_ID| Scheme_Name | OpeningBalance | OpeningUnits | InvstAmount | invstUnits | redemedAmount | redemedUnits | SwitchedOutAmt | SwitchOutUnit | bonusAmt | bonusUnit | DividentAmount | DividentUnit | Outstanding | OutstandingUnit | WAC 
------------------------------------------------------------------------------------------- 

Вот как я рассчитываю детали. Пожалуйста, предложите мне лучший способ сделать это.

Я использую SQL Server 2008

+0

Вы должны использовать соединения, а не подзапросы – Justin

+0

Параметр 'where' на каждом из подзапросов с' SwitchedOutAmount' года не имеют ничего общего с 'SwitchDetails' таблиц они ссылаются - так что номера собираются' sum' весь стол ... – dav1dsm1th

+0

Если у вас много параллельных отношений 1-N, вам, вероятно, придется использовать подзапросы (группировка может дублировать строки), но даже тогда вы всегда можете агрегировать многие значения в одном (субо) запросе, например «select sum() как a1, сумма() как как2, ... из ... ". – Arvo

ответ

0

подзапросов при тех же условиях, вероятно, худшие враги производительности в этом случае.

Попробуйте для внутреннего запроса:

SELECT 
    c.scheme_ID, 
    d.schemeName, 
    d.Openingbalance AS OpeningBalance, 
    d.OpeningUnits AS openingUnits, 
    ISNULL(SUM(c.invstAmount), 0) AS invstAmount, 
    ISNULL(SUM(c.invstUnits), 0) AS invstUnits, 

    ISNULL(SUM(r.redemedAmt), 0) AS redeemedAmount, 
    ISNULL(SUM(r.redeemedUnits), 0) AS redeemedUnits, 
    ISNULL(SUM(r.switchOutAmt), 0) AS SwitchedOutAmount, 
    ISNULL(SUM(r.switchOutUnits), 0) AS SwitchedOutUnits, 
    ISNULL(SUM(r.switchOutAmt), 0) AS SwitchedInAmount, 
    ISNULL(SUM(r.SwitchedInUnits), 0) AS SwitchedInUnits 
FROM Investment AS c 
INNER JOIN redemption AS r 
    ON r.StatusFlag='A' AND r.scheme_ID = C.scheme_ID 
--INNER JOIN someTable AS d... 
0

Вы можете сделать что-то вроде этого (я не вставил GROUP BY положения или просуммировать Openingbalance, OpeningUnits вы знаете лучше логику запрос, я редактировал только для исполнения):

SELECT *, 
     CASE 
      WHEN OutstandingUnits <> 0 THEN CONVERT(decimal(18,2),Outstanding/OutstandingUnits) 
      ELSE 0 
     END AS WAC 
FROM 
    (SELECT C.scheme_ID, 
      D.schemeName, 
      D.Openingbalance AS OpeningBalance, 
      D.OpeningUnits AS openingUnits, 
      ISNULL(SUM(C.invstAmount),0) AS invstAmount, 
      ISNULL(SUM(C.invstUnits),0) AS invstUnits, 
     ISNULL(SUM(r.redemedAmt),0) redeemedAmount, 
     ISNULL(SUM(r.redeemedUnits),0) redeemedUnits, 
     ISNULL(sum(sd.switchOutAmt),0) SwitchedOutAmount, 
     ISNULL(sum(sd.switchOutUnits),0) SwitchedOutUnits, 
     ISNULL(sum(sd.switchOutAmt),0) SwitchedInAmount, 
     ISNULL(sum(sd.SwitchedInUnits),0) SwitchedInUnits, 
      --The sum columns from above query 
      ISNULL(OpeningBalance,0) + ISNULL(DividendAmount,0) + ISNULL(bonusAmount,0) + ISNULL(invstAmount,0) + 
      ISNULL(SwitchedInAmount,0) - ISNULL(redeemedAmount,0) - ISNULL(SwitchedOutAmount,0) AS Outstanding, 
      ISNULL(openingUnits,0) + ISNULL(DividendUnits,0) + ISNULL(bonusUnits,0) + ISNULL(invstUnits,0) + 
      ISNULL(SwitchedInUnits,0) - ISNULL(redeemedUnits,0) - ISNULL(SwitchedOutUnits,0) AS OutstandingUnits, 
      ---- 
     .. same way 
     FOR bonus 
     AND divident .. 
     FROM Investment c 
     LEFT JOIN redemption r 
     ON r.StatusFlag='A' 
     AND r.scheme_ID = C.scheme_ID 
     LEFT JOIN SwitchDetails sd 
     ON sd.Status = 'A' 
     AND sd.From_Scheme_Id = C.scheme_ID 
     ) tab 
Смежные вопросы