2012-03-14 1 views
2

Прежде всего, это домашнее задание, но я не ищу ответа любыми способами. Я в классе базы данных, и нам была предоставлена ​​база данных со статистикой в ​​Американской бейсбольной лиге (команды, статистика для каждого человека и т. Д.), Определение схемы для каждой таблицы ниже вопроса. Мне нужно написать следующий запрос:Найти человека с самыми высокими прогонами для каждой команды (DERBY/SQL)

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

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

select 
    nameFirst, nameLast, name, HR 
from 
    Players, Teams, Batting 
where 
    HR >= ALL(select HR from Batting) 
    and Players.playerID = Batting.playerID; 

который отображает правильное название команды (и я знаю это, потому что он отображает 30 кортежи, и это число команд в БД), но количество бежит домой и первое и последнее имя игрока все тоже самое. (В этой базе данных это принц Филдерс для пивоваров, потому что он имеет большинство домашних запусков в базе данных.) Совет о том, как достичь, так это отображение правильного имени и фамилии человека, очень ценится!

CREATE TABLE Players 
(
    playerID VARCHAR(10), --A unique code asssigned to each player. The playerID 
    --links the data in this file with records in the other files. 
    nameFirst VARCHAR(50), --First name 
    nameLast VARCHAR(50), --Last name 
    bats CHAR(1), --Player's batting hand (left, right, or both) 
    throws CHAR(1), --Player's throwing hand (left or right) 
    PRIMARY KEY (playerID) 
); 

CREATE TABLE Teams 
(
    teamID CHAR(3), --Three-letter team code 
    lgID CHAR(2), --Two-letter league code 
    divID CHAR(1), --One letter code for the division the team player in 
    Rank SMALLINT, --Position in final standings in that division 
    G SMALLINT, --Games played 
    W SMALLINT, --Games won 
    L SMALLINT, --Games lost 
    DivWin CHAR(1), --Division winner (Y or N) 
    WCWin CHAR(1), --Wild card winner (Y or N) 
    LgWin CHAR(1), --League champion (Y or N) 
    WSWin CHAR(1), --World series winner 
    name VARCHAR(50), --Team's full name 
    park VARCHAR(255), --Name of team's home ballpark 
    PRIMARY KEY (teamID) 
); 

CREATE TABLE Batting 
(
    playerID VARCHAR(10), --Player ID code 
    yearID SMALLINT, --Will always be 2011 in data for this assignment 
    stint SMALLINT, --Used to identify a particular continuous period that 
    --a player played for one team during the season. For example, a player 
    --who played during May for the Brewers, was then sent down to the 
    --minors and came back to play again for the Brewers in August would 
    --have two stints -- numbered 1 and 2 
    teamID CHAR(3), --Three-letter team ID 
    lgID CHAR(2), --Two letter league ID -- NL or AL 
    G SMALLINT, --Number of games appeared in during this stint 
    G_batting SMALLINT, --Number of games appeared in as a batter during this stint 
    AB SMALLINT, --Number of at bats 
    R SMALLINT, --Number of runs 
    H SMALLINT, --Number of hits 
    doubles SMALLINT, --Number of doubles 
    triples SMALLINT, --Number of triples 
    HR SMALLINT, --Number of home runs 
    RBI SMALLINT, --Number of runs batted in 
    SB SMALLINT, --Number of stolen bases 
    CS SMALLINT, --Number of times caught trying to steal a base 
    BB SMALLINT, --Number of base on balls (walks) 
    SO SMALLINT, --Number of time player struck out 
    IBB SMALLINT, --Number of intentional walks received 
    HBP SMALLINT, --Number of time hit by pitch 
    SF SMALLINT, --Number of sacrifice flied 
    GIDP SMALLINT, --Number of times grounded into double play 
    PRIMARY KEY (playerID, stint) 
); 
+0

Я не эксперт SQL каким-либо образом, но у меня создается впечатление, что если вы хотите сделать математическое выражение, вы можете использовать предложение HAVING. Он работает еще лучше, если вы комбинируете HAVING с MAX (каким-то полем) – Kristian

+0

Хм, я пробовал возиться с инструкцией «Имею», но я не мог ее получить, так что это дало бы мне что-нибудь еще, чем просто человек с наибольшим количеством домашних бегов в БД. – joebro

ответ

0

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

Присоединившись к таблице Batter для себя, вы создаете так называемое «декартово произведение», которое представляет собой комбинацию из двух колотит в этой таблице. Оттуда вы можете вычислить сумму HR, а затем упорядочить по этому значению соответствующим образом.

Я дам вам запрос, если хотите, но я знаю, что вы сказали, что это домашняя работа, поэтому, если вы хотите попробовать и выяснить это на основе моего объяснения, вы можете опубликовать любые вопросы, которые у вас есть, и я могу помочь оттуда :)

Удачи вам!

+0

Да, извините. Он не скопировал правильно, теперь он обновлен. Так вот что я начал работать с 'Выберите отдельный Batting1.HR, nameFIRST, nameLAST, имя от Batting1, Batting1 b1, Players1, Teams1 где Batting1.playerID = Players1.playerID и HR> ???? ; ' Я смущен относительно того, как определить, что у двух колотит самый высокий. Спасибо огромное! – joebro

0
select t.teamname, p1.HR + p2.HR as [Sum], p1.playerid, p2.playerid 
from player p1 
join player p2 
    on p1.teamid = p2.teamid 
    and p1.playerid <> p2.playerid 
join team t 
    on p1.teamid = t.teamid 
    and p2.teamid = t.teamid 

Это, несомненно, приведет вас на правильный путь.

+0

Я просто понял, что мои схемы не были правильно скопированы на вопрос, поэтому я обновил его. Но по какой-то причине он выдает ошибку в этой строке «p1.HR + p2.HR как [Sum]». Я не знаю, разрешает ли дерби это или нет. Но для схем HR хранится в batting, так что я бы сменил ваш код 'с игрока p1 соединить игрока p2' с' с моргнув b1 join batting b2'? – joebro