У меня есть веб-сайт, который отслеживает инвестиции в паевые инвестиционные фонды. для этого у меня есть ниже структуры таблицы (структура была изменена, чтобы удалить ненужные столбцы таким образом, чтобы принести внимание на мою проблему)нужна помощь оптимизированный запрос 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
Вы должны использовать соединения, а не подзапросы – Justin
Параметр 'where' на каждом из подзапросов с' SwitchedOutAmount' года не имеют ничего общего с 'SwitchDetails' таблиц они ссылаются - так что номера собираются' sum' весь стол ... – dav1dsm1th
Если у вас много параллельных отношений 1-N, вам, вероятно, придется использовать подзапросы (группировка может дублировать строки), но даже тогда вы всегда можете агрегировать многие значения в одном (субо) запросе, например «select sum() как a1, сумма() как как2, ... из ... ". – Arvo