Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите написать запрос.  [new]
Mihanski
Member

Откуда:
Сообщений: 2
Доброго времени суток! Изучаю MS SQL, застопорился намертво на одном моменте, нужна помощь.
Дано 2 таблицы:
Employees
EmployeeID LastName FirstName City Country
5 Davolio Nancy Seattle USA
2 Fuller Andrew Tacoma USA
6 Leverling Janet Kirkland USA
4 Peacock Margaret Redmond USA
3 Callahan Laura Seattle USA


Orders
OrderID CustomerID EmployeeID ShipCity
10248 VINET 5 Boston
10274 TOMPSR 6 New York
10295 HANAR 2 Rio de Janerio
10737 VINET 2 Graz
10739 CENTCS 3 Albukerke

Задача:
  • По таблице Orders найти количество заказов, сделанных каждым продавцом. Заказ для указанного продавца – это любая запись в таблице Orders, где в колонке EmployeeID задано значение для данного продавца.
  • В результатах запроса надо высвечивать колонку с именем продавца (Должно высвечиваться имя полученное конкатенацией LastName & FirstName. Эта строка LastName & FirstName должна быть получена отдельным запросом в колонке основного запроса. Также основной запрос должен использовать группировку по EmployeeID.) с названием колонки ‘Seller’ и колонку c количеством заказов высвечивать с названием 'Amount'.
  • Результаты запроса должны быть упорядочены по убыванию количества заказов.

    У меня получился такой текст запроса на вывод количества заказов и соответствующих им продавцов:

    Select Count (*) as Amount, orders.EmployeeID as Seller
    from Orders, Employees
    (
    Часть в скобках и есть для меня проблема. Не понимаю как присвоить выведенному полю "Seller"(см.ниже), 
    имя продавца из соседней таблицы. Не пинайте сильно за написанное ниже
    where orders.EmployeeID =
    (Select (LastName + ', ' + FirstName)
    from Employees
    where orders.EmployeeID = Employees.EmployeeID)

    )
    group by orders.EmployeeID
    order by Amount desc


    Получаю такой вывод(считает верно, у меня в таблице значений много больше естественно):
    Amount Seller
    1404 4
    1143 3
    1107 1
    936 8
    864 2
    648 7
    603 6
    387 9
    378 5


    Повторю вопрос, озвученный выше:
    Как полю "Seller" присвоить "LastName + ', ' + FirstName" из соседней таблицы, которому будет соответствовать EmloyeeID из той же строки??
  • 10 сен 16, 22:46    [19651307]     Ответить | Цитировать Сообщить модератору
     Re: Помогите написать запрос.  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 31949
    Mihanski
    Задача:
  • По таблице Orders найти количество заказов, сделанных каждым продавцом. Заказ для указанного продавца – это любая запись в таблице Orders, где в колонке EmployeeID задано значение для данного продавца.
  • В результатах запроса надо высвечивать колонку с именем продавца (Должно высвечиваться имя полученное конкатенацией LastName & FirstName. Эта строка LastName & FirstName должна быть получена отдельным запросом в колонке основного запроса. Также основной запрос должен использовать группировку по EmployeeID.) с названием колонки ‘Seller’ и колонку c количеством заказов высвечивать с названием 'Amount'.
  • Результаты запроса должны быть упорядочены по убыванию количества заказов.

    У меня получился такой текст запроса на вывод количества заказов и соответствующих им продавцов:

    Повторю вопрос, озвученный выше:
    Как полю "Seller" присвоить "LastName + ', ' + FirstName" из соседней таблицы, которому будет соответствовать EmloyeeID из той же строки??
  • Да, плоховато у вас с запросами :-)

    Select    Count (*) as Amount, e.LastName + ', ' + e.FirstName as Seller
    from Orders o
        join Employees e
            on o.EmployeeID = e.EmployeeID
    group by e.LastName, e.FirstName
    order by Amount desc
    
    10 сен 16, 23:31    [19651420]     Ответить | Цитировать Сообщить модератору
     Re: Помогите написать запрос.  [new]
    iljy
    Member

    Откуда:
    Сообщений: 8711
    alexeyvg,

    так не по честному будет: нет никаких гарантий, что пара имя+фамилия однозначно идентифицирует продавца.

    Select  Amount, e.LastName + ', ' + e.FirstName as Seller
    from (
      Select    Count (*) as Amount, o.EmployeeID
      from Orders o
      group by e.LastName, e.FirstName
    ) o  join Employees e on o.EmployeeID = e.EmployeeID
    order by Amount desc
    
    10 сен 16, 23:39    [19651439]     Ответить | Цитировать Сообщить модератору
     Re: Помогите написать запрос.  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 31949
    iljy
    так не по честному будет: нет никаких гарантий, что пара имя+фамилия однозначно идентифицирует продавца.
    В принципе да, конечно, но в такой постановке задачи вывод двух строк с одинаковыми именами будет не сильно лучше :-)
    10 сен 16, 23:58    [19651477]     Ответить | Цитировать Сообщить модератору
     Re: Помогите написать запрос.  [new]
    Mihanski
    Member

    Откуда:
    Сообщений: 2
    Премного благодарен, JOIN'ы только начал курить, пока не понимаю как их правильно применять)

    Может заодно посоветуете какую литературу использовать?
    Я читаю:
    Мартин Грубер "Понимание sql" как базу и лезу на msdn.microsoft.com за подробностями работы операторов. Но как-то не хватает, бывает плохо разжёвано.
    11 сен 16, 15:10    [19652170]     Ответить | Цитировать Сообщить модератору
     Re: Помогите написать запрос.  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 31949
    Mihanski
    Я читаю:
    Мартин Грубер "Понимание sql" как базу и лезу на msdn.microsoft.com за подробностями работы операторов. Но как-то не хватает, бывает плохо разжёвано.
    Что то мне эта книга совсем не нравится... Полистал, прямо ошарашило...

    Не знаю, что посоветовать, давно не читал таких :-) Можно взять какую то базовую книгу про MSSQL, убедившись, что в ней есть основы (простые SELECT-ы, объяснения про "таблицы" и т.д.)
    12 сен 16, 00:13    [19653040]     Ответить | Цитировать Сообщить модератору
     Re: Помогите написать запрос.  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47142
    Когда-то очень-очень давно мне понравилось это: http://citforum.ru/database/osbd/contents.shtml
    Правда, в бумажном виде.
    Может, сейчас и не понравилось бы. Не знаю, не перечитывал.
    12 сен 16, 10:11    [19653530]     Ответить | Цитировать Сообщить модератору
     Re: Помогите написать запрос.  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 31949
    iap
    Когда-то очень-очень давно мне понравилось это: http://citforum.ru/database/osbd/contents.shtml
    Правда, в бумажном виде.
    Может, сейчас и не понравилось бы. Не знаю, не перечитывал.
    Это как то академично и "обо всём" :-)

    Конечно, для полноценного высшего образования самое то, но для "освоить SQL", типа, чтоб веб-программисту лабать запросы, начинать изучение с запись-ориентированных файловых систем, как прообраза СУБД, потом System R, потом иеархические СУБД, ну и т.д., притом что объяснение выглядит как сухая формула определения синтаксиса - это выглядит немного избыточным...
    12 сен 16, 11:11    [19653823]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить