SQL Еще одно решение этого запроса? - PullRequest
0 голосов
/ 22 мая 2019

Может кто-нибудь придумать другое решение этого запроса (или исправить ошибку в моем, если вы ее видите? Мое решение, по-видимому, не дает мне правильного результата (так говорит мой профессор), и он не скажет мнепочему. Любая помощь приветствуется. Вопрос, ERD, вход и мой вывод ниже:

Выход:

2   Euronext Paris          EP  2019-04-22 13:06:36
1   London Stock Exchange   LSE 2019-03-28 13:06:36
5   Moscow Stock Exchange   MSE NULL
6   NASDAQ Stock Exchange   NASDAQ  2019-05-09 13:06:36
3   New York Stock Exchange NYSE    2019-05-20 13:06:36
4   Tokyo Stock Exchange    TSE 2019-04-10 13:06:36
  • Для каждой акции, котирующейся на каждой фондовой бирже, отобразитеназвание биржи, символ акций и дата и время последней торговли акциями. Сортируйте вывод по названию фондовой биржи, символу акций. Если акции не были проданы, покажите NULL для даты последней торговли.
SELECT
stock_exchange.stock_ex_id, 
stock_exchange.name stock_exchange_name,
stock_exchange.symbol,
nvl(to_char(max(trade.transaction_time), 'yyyy-mm-dd hh24:mi:ss'), 'NULL') as last_traded
FROM stock_exchange 
LEFT JOIN trade
ON trade.stock_ex_id = stock_exchange.stock_ex_id
GROUP BY stock_exchange.stock_ex_id, stock_exchange.name, stock_exchange.symbol
ORDER BY stock_exchange.name, stock_exchange.symbol;

ERD

Ответы [ 2 ]

1 голос
/ 22 мая 2019

В вашем ERD отсутствует связь между Trade и Stock_Listing. Stock_Listing - это место, где вы получите символ акции:

SELECT
    stock_exchange.stock_ex_id, 
    stock_exchange.name stock_exchange_name,
    stock_listing.symbol,
    nvl(to_char(max(trade.transaction_time), 'yyyy-mm-dd hh24:mi:ss'), 'NULL') as last_traded
FROM stock_exchange 
    JOIN stock_listing
    ON stock_exchange.stock_ex_id =  stock_listing.stock_ex_id
    LEFT JOIN trade
    ON trade.stock_ex_id = stock_listing.stock_ex_id
    and trade.stock_id =  stock_listing.stock_id
GROUP BY stock_exchange.stock_ex_id, stock_exchange.name, stock_listing.symbol
ORDER BY stock_exchange.name, stock_listing.symbol;

Примечания:

  1. Вам необходимо включить stock_ex_id в набор результатов
  2. Вам нужно включить строку NULL, когда Акция не была продана. Не хватит ли пробела (т.е. null)?
0 голосов
/ 22 мая 2019

Я думаю, что вы хотите:

select sl.stock_ex_id, se.name, sl.symbol, max(t.trade_time)
from stock_listing sl join  -- inner join should be fine
     stock_exchange se
     on se.stock_ex_id = sl.stock_ex_id left join
     trade t
     on t.stock_id = sl.stock_id
group by sl.stock_ex_id, se.name, sl.symbol;

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

max() вернет NULL значение, а не 'NULL' строку, но это похоже на вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...