Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Запрос на выбор Максимума, используя данные 2 таблиц  [new]
spiderman5
Member

Откуда:
Сообщений: 11
Всем привет ! Есть такая БД Библиотека: в ней много таблиц, из которых для запроса нужны такие таблицы:
Таблица Библиотекари: поле ID, поле Фамилия;
Таблица Студенческая карточка: поле ID, поле Внешний ключ на ID библиотекаря и другие поля, которые сейчас не нужны.
Таблица Преподовательская карточка: поле ID, поле Внешний ключ на библиотекарей и другие поля, которые сейчас не нужны.

Запрос: возвращает фамилию библиотекаря, выдавшего наибольшее кол-во книг.

Я знаю, как решить, если брать данные только из одной таблицы, например из преподовательской карточки

SELECT TOP 1 WITH TIES Librarians.LastName, MAX(Librarians.CountOfBooks) AS Books FROM
(SELECT L.LastName, COUNT(*) AS CountOfBooks FROM Libs L, T_Cards T
WHERE T.Id_Lib IN (SELECT L.Id)
GROUP BY L.LastName) AS Librarians
GROUP BY Librarians.LastName
ORDER BY MAX(Librarians.CountOfBooks) DESC
GO


Я пытаюсь добавить также данные из студ карточки, но подсчет неправильный ((
Кто может, пожалуйста, подскажите, как правильно сделать данный запрос.
10 июн 15, 21:42    [17757473]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
spiderman5
Я пытаюсь добавить также данные из студ карточки
Показывай, как именно.
10 июн 15, 21:55    [17757510]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
spiderman5,

Во-первых, уже давно пора использовать ANSI JOINs. Во-вторых данные из двух сходных по структуре таблиц (подзапросов) можно объединить с помощью UNION ALL.
10 июн 15, 22:06    [17757551]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
spiderman5
Member

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

Вот, например, пытаюсь так, но подсчет неверный:

SELECT TOP 1 WITH TIES Librarians.LastName, MAX(Librarians.CountOfBooks) AS Books FROM
(SELECT L.LastName, COUNT(*) AS CountOfBooks FROM Libs L, T_Cards T, S_Cards S
WHERE T.Id_Lib IN (SELECT L.Id) AND S.Id_Lib IN (SELECT L.Id)
GROUP BY L.LastName) AS Librarians
GROUP BY Librarians.LastName
ORDER BY MAX(Librarians.CountOfBooks) DESC
GO
10 июн 15, 22:07    [17757556]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
spiderman5
Member

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

Если можете показать, как объединить через UNION ALL, то пожалуйста помогите!
10 июн 15, 22:08    [17757562]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
spiderman5
Если можете показать, как объединить через UNION ALL, то пожалуйста помогите!


В Вашем понимании помочь - это сделать что-то за Вас? Или Вы, все-таки, потрудитесь открыть соотвествующий раздел документации и разобрать примеры, раз уж проектировщик сей модели данных не додумался создать одну сущность "Карточка", типизировав её.
10 июн 15, 22:14    [17757577]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
spiderman5
Member

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

Если вы не хотите отвечать, то лучше просто промолчать, чем что-либо советовать.
Если бы я понял, как реализовать это после прочтения, я бы сюда не писал.
10 июн 15, 22:37    [17757673]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
spiderman5,
автор
Если вы не хотите отвечать, то лучше просто промолчать, чем что-либо советовать.

Я надеюсь, что Вы оставите за мной право самостоятельно принимать решение, что лучше?
автор
Если бы я понял, как реализовать это после прочтения, я бы сюда не писал.

Отлично! Поделитесь с нами, что Вы не поняли после прочтения? Что еще Вы предпринимали, кроме прочтения?
10 июн 15, 22:46    [17757702]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
spiderman5
Member

Откуда:
Сообщений: 11
pkarklin
spiderman5,
автор
Если вы не хотите отвечать, то лучше просто промолчать, чем что-либо советовать.

Я надеюсь, что Вы оставите за мной право самостоятельно принимать решение, что лучше?
автор
Если бы я понял, как реализовать это после прочтения, я бы сюда не писал.

Отлично! Поделитесь с нами, что Вы не поняли после прочтения? Что еще Вы предпринимали, кроме прочтения?


Задал вопрос на форуме и показал свой код, думая, что мне помогут показать, как его сделать правильным.

Я использую UNION ALL в простых примерах между 2 запросами, а с агрегатными функциями, в которую нужно передать данные из 2 таблиц, не получается. Ошибки выводятся всё время.
10 июн 15, 22:53    [17757722]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
spiderman5
Я использую UNION ALL в простых примерах между 2 запросами, а с агрегатными функциями, в которую нужно передать данные из 2 таблиц, не получается. Ошибки выводятся всё время.

Полагаю, будет логичным привести код и ошибки, к которым он приводит.
10 июн 15, 23:02    [17757746]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
xenix
Guest
автор
Таблица Студенческая карточка: поле ID, поле Внешний ключ на ID библиотекаря и другие поля, которые сейчас не нужны.
Таблица Преподовательская карточка: поле ID, поле Внешний ключ на библиотекарей и другие поля, которые сейчас не нужны.

SELECT ST.LIBRARIAN_ID,COUNT(*)CNT 
FROM STUDCARD AS ST
GROUP BY ST.LIBRARIAN_ID,

UNION ALL

SELECT TE.LIBRARIAN_ID,COUNT(*)CNT
FROM TEACHERCARD AS TE
GROUP BY TE.LIBRARIAN_ID

так можно сшить две карточки (студентов и преподавателей)
10 июн 15, 23:38    [17757808]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
spiderman5
Member

Откуда:
Сообщений: 11
Сделал пока что таким образом:
SELECT TOP 1 WITH TIES Librarians.Id_Lib, MAX(Librarians.HisBooks) AS Books FROM
(SELECT SC.Id_Lib, COUNT(*) AS HisBooks FROM S_Cards SC
WHERE SC.Id_Lib IN (SELECT L.Id FROM Libs L)
GROUP BY SC.Id_Lib
UNION ALL
SELECT TC.Id_Lib, COUNT(*) AS HisBooks FROM T_Cards TC
WHERE TC.Id_Lib IN (SELECT L.Id FROM Libs L)
GROUP BY TC.Id_Lib) AS Librarians
GROUP BY Librarians.Id_Lib
ORDER BY MAX(Librarians.HisBooks) DESC


Пока выводит результат правильный по студенческим карточкам.
Как вывести результат по сумме 2 карточек, пока не знаю.
11 июн 15, 00:06    [17757889]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
spiderman5
Я знаю, как решить, если брать данные только из одной таблицы, например из преподовательской карточки

SELECT TOP 1 WITH TIES Librarians.LastName, MAX(Librarians.CountOfBooks) AS Books FROM
(SELECT L.LastName, COUNT(*) AS CountOfBooks FROM Libs L, T_Cards T
WHERE T.Id_Lib IN (SELECT L.Id)
GROUP BY L.LastName) AS Librarians
GROUP BY Librarians.LastName
ORDER BY MAX(Librarians.CountOfBooks) DESC
GO

Кто может, пожалуйста, подскажите, как правильно сделать данный запрос.


Вместо
FROM
(SELECT ... ) AS Librarians


Подставьте выборку из объединенного селекта

FROM
(SELECT ST.Id_Lib,ST.LastName,COUNT(*) CountOfBooks 
   FROM S_Cards  AS ST
   GROUP BY ST.Id_Lib,ST.LastName,

   UNION ALL

   SELECT TE.Id_Lib,TE.LastName,COUNT(*) CountOfBooks
   FROM T_Cards D AS TE
   GROUP BY TE.Id_Lib,TE.LastName
) AS Librarians

Как-то так... А вообще вопрос достаточно простой.
И связывать таблицы библиотекарей и карточек лучше по JOIN!
IN ( ... ) тут совсем не нужен.
11 июн 15, 08:59    [17758243]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
Jaffar
Member

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


select top 1 max(bm.name), count(1) Cnt
from (select sl.IDBibleMan from StudentLib sl with(nolock)
	  union all
	  select pl.IDBibleMan from PrepodLib pl with(nolock) ) t
join BibleMan bm with(nolock) on bm.ID = t.IDBibleMan
group by t.IDBibleMan
order by Cnt desc
11 июн 15, 09:31    [17758349]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Jaffar, нормально.
Только, как и писали выше, неплохо бы добавить
SELECT TOP 1 WITH TIES ...

Библиотекарей передовиков-выдаванцев может быть несколько с одинаковым количеством выданных книг.
11 июн 15, 09:45    [17758402]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
Jaffar
Member

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

да-да-да, пряма ка на sql-ex.ru.
11 июн 15, 12:58    [17759751]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
spiderman5
Member

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

Проверял ваш вариант, но что-то синтаксически перепутывал ( может из-за спешки сейчас.

Вобщем сегодня сделаны 2 правильных варианта, один из которых выглядит так:

SELECT TOP 2 LastName, COUNT (*) [count] FROM
(SELECT LastName FROM Libs L, S_Cards S
WHERE S.id_lib = L.id
UNION ALL
SELECT LastName FROM Libs L, T_Cards T
WHERE T.id_lib = L.id) As Res
GROUP By LastName 
ORDER BY COUNT (*) DESC
11 июн 15, 13:38    [17760054]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
spiderman5
Member

Откуда:
Сообщений: 11
Досконально вот так:
SELECT TOP 1 WITH TIES LastName, COUNT (*) [count] FROM
(SELECT LastName FROM Libs L, S_Cards S
WHERE S.id_lib = L.id
UNION ALL
SELECT LastName FROM Libs L, T_Cards T
WHERE T.id_lib = L.id) As Res
GROUP By LastName 
ORDER BY COUNT (*) DESC
11 июн 15, 13:39    [17760059]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
 ORDER BY COUNT (*) DESC 

Это можно сделать проще

 ORDER BY 2 DESC 

(второе поле)
11 июн 15, 14:28    [17760483]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SQL2008
 ORDER BY COUNT (*) DESC 


Это можно сделать проще

 ORDER BY 2 DESC 


(второе поле)
Проще не значит лучше.
11 июн 15, 14:31    [17760505]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
SQL2008
Это можно сделать проще

 ORDER BY 2 DESC 
И потом придется:
а) удивляться изменившемуся порядку строк в результирующем наборе, если изменится порядок столбцов в select-листе;
б) чтобы понять по какому же столбцу сортируем, листать запрос туда-сюда, если его текст не виден полностью.
11 июн 15, 14:59    [17760735]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
invm,

А в случае, когда вместо COUNT(*) в выборке будет мегавыражение?

Сообщение было отредактировано: 11 июн 15, 15:17
11 июн 15, 15:17    [17760872]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
pkarklin
invm,

А в случае, когда вместо COUNT(*) в выборке будет мегавыражение?
Подзапрос+ORDER BY во внешнем запросе!
11 июн 15, 15:19    [17760889]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
Кролик-зануда
Guest
pkarklin,

вроде как в order by можно алиасы из селекта использовать.
11 июн 15, 15:24    [17760915]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выбор Максимума, используя данные 2 таблиц  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
pkarklin
invm,

А в случае, когда вместо COUNT(*) в выборке будет мегавыражение?
1. В order by можно использовать алиасы столбцов;
2. Мегавыражение можно вынести в cross apply.
11 июн 15, 16:04    [17761204]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить