2016-12-16 2 views
0

Использование SQL Server выбрать для каждой компании в моем NYSE таблице:курсоры сервера SQL, циклы и набор на основе логических

  • Последняя цена сделки (от моих контрактов таблицы)
  • Max Bid Цена (от моих Инфо таблица)
  • Min Задать вопрос Цена (от моего спрашивает стол)

Я сделал это с движком и я исследуя LOOP WHILE, но при этом многие ответы предлагают SET БАЗЕ LOGIC (присоединяется и т.д.) может выполнить это. Однако я не вижу, как установленная логика может возвращать MAX (TimePlaced) из таблицы Контрактов в той же строке, что и MAX (BidPrice) и MIN (AskPrice) из их таблиц.

Извинения за псевдокод (это на самом деле намного сложнее этого) и за то, что он был noob - это лучшее/практическое решение для веб-приложения, которое заполняет каждую ячейку в таблице вывода HTML через отдельный запрос? ?

+3

Это поможет, если вы сможете отобразить образцы данных из всех задействованных таблиц? это выполнимо с запросом. –

+0

От того, что вы отправили, определенно не нужен цикл, но предоставить образец данных и ожидаемый результат – scsimon

ответ

1

У вас есть 4 стола, NYSE, контракты, ставки, задание. Предполагая, что у всех 4 таблиц есть Column CompanyId и что NYSE является основной таблицей (любой companyid в других таблицах будет на NYSE), это легко использовать с использованием синтаксиса общих табличных выражений.

;with Ct as (Select n.CompanyId, c.lastradeprice, 
row_number() over (partition by n.companyid 
        order by tradedatetime desc) rw 
     From nyse n inner join contract c on c.companyid =n.companyid), 
Bd as (Select n.CompanyId, max(bc.bidprice) bidprice 
     From nyse n inner join bids b on b.companyid =n.companyid 
     Group by n.companyid), 
Ak as (Select n.CompanyId, min(a.askprice) AskPrice 
     From nyse n inner join asks a on a.companyid =n.companyid 
     Group by n.companyid) 
Select n.companyId, ct.lasttradeprice, bd.tradeprice, ak.AskPrice 
From nyse n 
    Left join ct on ct.companyid = n.companyId and rw=1 
    Left join bd on bd.companyid = n.companyid 
    Left join ak on ak.companyid = n.companyid 

Объединения по контрактам имеет дополнительное условие, так как мы хотим, последнюю цену, не самое большой или меньшей мере, и поэтому результаты должны быть разбиты и приказали someho, что и раздел и порядок by.

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

+0

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

+0

Удивительно, ваше предложение отлично работает (я раньше смотрел на CTE, но не был уверен, что они предоставили то, что я хотел - следовательно, спустился по треку CURSOR/LOOP). –

+0

Надеюсь, вы не навязываете, но так как вы знакомы с базовой иерархией, каково ваше мнение об отмене нормализации таблицы контрактов? В частности, в настоящее время у меня есть Contract.Price и Contract.Currency как повторяющиеся записи Bid.Price и Bid.Currency (примечание Contract.Shares - это не то же самое, что и Bid.Shares, так как допускаются частичные заполнения заказа). Есть ли какие-либо преимущества для этого «для обеспечения безопасности» (т. Е. Все контракты. Цена и Bid.Price и Ask.Price должны быть одинаковыми)? Я понимаю, что это мнение, о котором я прошу, но спасибо заранее. –

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