2013-04-08 2 views
0

Я ищу способ, которым я могу рассчитать, какая стоимость акций находится в данный момент времени.SQL, чтобы рассчитать стоимость Акций в определенное время

В этом примере мне нужно рассчитать и сообщить об погашении акций в данном месяце.

Есть 3 таблицы, мне нужно, чтобы посмотреть на:

  1. Погашение таблица, которая имеет дату погашения, количество акций, которые были выкуплены и тип акций.

  2. Таблица типов акций, которая имеет тип общего доступа и связывает первую и третью таблицы.

  3. Таблица цены акций, которая имеет тип акций, дату оценки, значение.

Так что мне нужно сделать, это отчитываться и рассчитывать исходя из количества выкупа акций, стоимость которых разделяется по месяцам.

Это имеет смысл?

Заранее благодарим за вашу помощь!

Извинения, я думаю, я должен разработать немного дальше, поскольку, возможно, были некоторые недоразумения. Это не означает, что ежедневно меняются акции и акции, это больше для управления фондами. Это означает, что цена акций меняется только ежемесячно, и это также обычно отстает от месяца.

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

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

С уважением,

Phil

+0

Я не понимаю, что такое таблица «share type» и почему это необходимо. –

+0

@ No'am Newman, это было бы необходимо, если две другие таблицы не содержат значений для определенного типа ShareType, но все равно должны быть указаны в отчете. – valverij

+0

Причина другой таблицы заключается в том, что некоторые погашения будут в январе, когда цена акций будет равна одной стоимости, а затем в феврале по мере того, как цена будет расти, тогда цена будет отличаться от стоимости, поэтому ее необходимо рассчитать на основе цены, относящейся к время, когда погашения были зарегистрированы, если это имеет смысл – Pipster1981

ответ

0

Это должно сделать трюк (примечание: обновлена ​​группе ShareType):

SELECT 
    ST.ShareType, 
    RedemptionMonth = DateAdd(month, DateDiff(month, 0, R.RedemptionDate), 0), 
    TotalShareValueRedeemed = Sum(P.SharePrice * R.SharesRedeemed) 
FROM 
    dbo.Redemption R 
    INNER JOIN dbo.ShareType ST 
     ON R.ShareTypeID = ST.ShareTypeID 
    CROSS APPLY (
     SELECT TOP 1 P.* 
     FROM dbo.SharePrice P 
     WHERE 
     R.ShareTypeID = P.ShareTypeID 
     AND R.RedemptionDate >= P.SharePriceDate 
     ORDER BY P.SharePriceDate DESC 
    ) P 
GROUP BY 
    ShareType, 
    DateAdd(month, DateDiff(month, 0, R.RedemptionDate), 0) 
ORDER BY 
    ShareType, 
    RedemptionMonth 
; 

See it working in a Sql Fiddle.

Это может быть легко параметризован просто добавив ИНЕКЕ с условиями на Redemption таблицы. Если вам нужно, чтобы показать 0 для типов акций в месяцах, где у меня не было Redemptions, пожалуйста, дайте мне знать, и я улучшу свой ответ - это поможет, если вы немного воспользуетесь сценарием для использования, и точно укажите, что вы хотите ввести и что вы хотите видеть в качестве вывода ,

Также обратите внимание: я предполагаю, что всегда будет цена на выкуп акций - если существует выкуп, который до какой-либо цены акций для него, то выкуп будет исключен.

+0

Это очень близко, это на самом деле шаг вперед и лучше, чем мне нужно, если это вообще имеет смысл! Поскольку я ищу ценность для целей отчетности, мне нужно, чтобы она возвращала денежное значение выкупа по строке за строкой в ​​таблице выкупа. – Pipster1981

+0

С точки зрения бизнес-кейса, у нас есть фонд, который инвестирует в недвижимость в Великобритании. Внутри этого фонда есть различные подписки со всего мира, поэтому у нас есть фонды GBP, EUR, USD, Master и YEN. Каждый фонд имеет свою собственную цену акций, поскольку они были установлены в течение разных периодов времени и были инвестированы в разные объекты, поэтому они имеют разные цены акций. – Pipster1981

+0

Поскольку инвесторы вкладывают свои деньги в фонд, например, в январе 2007 года, говорят, что цена акций составляет 1,03 фунта стерлингов, а через 5 лет они выкупают свои акции, а цена составляет 1,90 фунта стерлингов, и они выкупают 10000 штук (акций), тогда ему необходимо рассчитать ценность этого выкупа. Теперь, когда существует период уведомления о выкупе средств, мы получим уведомление в начале марта о том, что оно погашено, но цена акций за март еще не установлена ​​ – Pipster1981

0

Если у вас есть оценки на каждый день, то расчет простого соединения с последующей агрегацией.Результирующий запрос что-то вроде:

select year(redemptiondate), month(redemptiondate), 
     sum(r.NumShares*sp.Price) as TotalPrice 
from Redemptions r left outer join 
    ShareType st 
    on r.sharetype = st.sharetype left outer join 
    SharePrice sp 
    on st.sharename = sp.sharename and r.redemptiondate = sp.pricedate 
group by year(redemptiondate), month(redemptiondate) 
order by 1, 2; 
+0

К сожалению, у нас нет ежедневной оценки, это ежемесячно, и это немного усложняется, так как обычно это занимает месяц, поэтому нам также нужно будет учитывать самые последние и использовать это, была цена для этот месяц. – Pipster1981

+0

@ Pipster1981: вы должны добавить эту информацию о том, что у вас есть только одно значение в месяц, потому что это очень важно для ответа. Это также совершенно неточно - цена акций может измениться на 10% в течение месяца. –

+0

Я знаю, что традиционная цена акций может, однако, это не традиционная цена акций, это цена акций, а цена акций для фонда может обновляться ежемесячно, как это. – Pipster1981

0

Если я правильно понял ваш вопрос, вам нужен запрос как

select shares.id, shares.name, sum (redemption.quant * shareprices.price) 
from shares 
inner join redemption on shares.id = redemption.share 
inner join shareprices on shares.id = shareprices.share 
where redemption.curdate between :p1 and :p2 
order by shares.id 
group by shares.id, shares.name 

: p1 и р2 являются параметры даты

0

Если вам просто нужно для диапазон одна дата:

SELECT s.ShareType, SUM(ISNULL(sp.SharePrice, 0) * ISNULL(r.NumRedemptions, 0)) [RedemptionPrice] 
FROM dbo.Shares s 
LEFT JOIN dbo.Redemptions r 
    ON r.ShareType = s.ShareType 
OUTER APPLY (
    SELECT TOP 1 SharePrice 
    FROM dbo.SharePrice p 
    WHERE p.ShareType = s.ShareType 
    AND p.ValuationDate <= r.RedemptionDate 
    ORDER BY p.ValuationDate DESC) sp 
WHERE r.RedemptionDate BETWEEN @Date1 AND @Date2 
GROUP BY s.ShareType 

Где @ Date1 и @ Date2 - ваши даты

Проверки ISNULL находятся там, поэтому он фактически дает вам значение, если что-то пустое (оно будет 0). В этом случае это совершенно необязательно, это личное предпочтение.

В OUTER APPLY действует как LEFT JOIN, которые будут фильтровать вниз результаты SharePrice, чтобы убедиться, что вы получите самую последнюю ValuationDate из таблицы на основе RedemptionDate, даже если он не был из того же диапазона дат в тот же день. Вероятно, это может быть достигнуто другим способом, но я чувствую, что это легко читаемо.

Если вы не чувствуете себя комфортно с OUTER APPLY, вы можете использовать подзапрос в SELECT, части (т.е. ISNULL(r.NumRedemptions, 0) * (/* subquery from dbo.SharePrice here */)

+0

Возможно, пойдите с r.RedemptionDate, а не @ Date2 в подзапрос, чтобы получить самую близкую цену – Paparazzi

+0

@Blam Хороший звонок, я сделаю редактирование. Я не думаю, что это может быть отфильтровано в подзапросе в соединении, хотя ему придется переместиться в другое место. – valverij

+0

Оператор APPLY похож на оператор JOIN, но разница в том, что оператор правой руки APPLY может ссылаться на столбцы с левой стороны. – Paparazzi

Смежные вопросы