Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 23.04.2012
Сообщений: 42
1

Сложный запрос на выборку

03.11.2013, 13:24. Показов 1019. Ответов 7
Метки нет (Все метки)

Доброго времени суток.
Моих знаний не хватает, чтоб сформировать нужный запрос.
Суть такая: есть таблица с изданиями, в которой есть 2 поля: код и название. Есть таблица авторов, с полями код и фио. И есть связующая таблица с полями код_автора, код_издания и доля_автора (доли авторов могут быть одинаковыми). У одного издания может быть несколько авторов (это важно).
Мне необходимо написать запрос, который будет формировать следующую выборку:
- Код издания
- Название издания
- ФИО авторов издания через запятую
или другую выборку:
- Код издания
- Название издания
- ФИО автора с максимальной долей (если доли одинаковы, то первого по алфавиту автора)
- Доля автора

Весь мозг уже сломал, не могу понять как это сделать. Помогите запросом, или хотя бы идеей как это сделать.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.11.2013, 13:24
Ответы с готовыми решениями:

Сложный запрос к БД
Есть БД, в ней таблица main с полями ip(адрес абонента),datetime(время запроса),size(размер ответа...

Сложный запрос
Всем доброго времени суток. Всех милых дам с 8 марта!:rose: И так у меня БД: Реляционная...

Сложный запрос
Всем привет! (пример) Есть 3 таблицы:Users, Auto, Motorcycles. (Они связаны через ключевое поле...

Сложный запрос
Доброго времени суток! Знатоки SQL подскажите пожалуйста как привести в рабочий вид мой запрос: ...

7
41 / 40 / 23
Регистрация: 10.03.2012
Сообщений: 374
03.11.2013, 16:27 2
Vaste, нужно сделать естественное соединение между отношением "издание" и связующей таблицей, потом между полученной таблицей и отношением "автор", а затем сделать проекцию на необходимые атрибуты
0
1 / 1 / 0
Регистрация: 23.04.2012
Сообщений: 42
04.11.2013, 10:13  [ТС] 3
Цитата Сообщение от RocBoy-D Посмотреть сообщение
Vaste, нужно сделать естественное соединение между отношением "издание" и связующей таблицей, потом между полученной таблицей и отношением "автор", а затем сделать проекцию на необходимые атрибуты
Вы мне вот прям глаза открыли. Прям как вот я жил раньше, даже не представляю! Я как бы и сам в курсе, что надо таблицы соединить! Затруднение как раз в "проекции". (ПС. Не будет вам спасибо в репу).
SQL
1
2
3
4
5
6
7
8
9
10
SELECT
Издания.Код
,Издания.Название
,MAX(АвторыИздания.Доля)
,Авторы.Издания.КодАвтора
,Авторы.ФИО
FROM
Издания
INNER JOIN АвторыИздания ON АвторыИздания.КодИздания = Издания.Код
INNER JOIN Авторы ON Авторы.Код = АвторыИздания.КодАвтора
Вот код, что я пытал. Но он при равных долях авторов одного издания выводит ОБОИХ. А мне надо ОДНОГО. Вот чё я не могу понять. А не то, что надо соединения таблиц сделать.
0
0 / 0 / 0
Регистрация: 03.11.2013
Сообщений: 5
04.11.2013, 10:22 4
Через временные таблицы. Для первой еще курсор использовать.
0
1 / 1 / 0
Регистрация: 23.04.2012
Сообщений: 42
04.11.2013, 10:23  [ТС] 5
Поподробней, пожалуйста. Или ссылки на примеры.
0
0 / 0 / 0
Регистрация: 03.11.2013
Сообщений: 5
04.11.2013, 10:38 6
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
DECLARE @temp1 TABLE (код_издания BIGINT, название VARCHAR(200), авторы VARCHAR(MAX))
INSERT INTO @temp1 
SELECT DISTINCT код, название, ''
FROM издания WITH(nolock)
 
DECLARE @код_издания BIGINT, @фио_автора VARCHAR(200)
DECLARE mcur cursor LOCAL fast_forward FOR
SELECT DISTINCT изд.код, авт.фио
FROM издания изд WITH(nolock)
JOIN связующая связ WITH(nolock) ON изд.код = связ.код_издания
JOIN авторы авт WITH(nolock) ON авт.код = связ.код_автора
OPEN mcur
fetch NEXT FROM mcur INTO @код_издания, @фио_автора
while @@FETCH_STATUS = 0 BEGIN
   UPDATE @temp1 SET авторы = авторы + ', ' + @фио_автора WHERE код_издания = @код_издания
 
   fetch NEXT FROM mcur INTO @код_издания, @фио_автора
END
close mcur
deallocate mcur
 
SELECT * FROM @temp1
второй по аналогии. пожалуй, там тоже курсор нужен.
0
1529 / 1090 / 155
Регистрация: 23.07.2010
Сообщений: 6,124
04.11.2013, 11:17 7
Цитата Сообщение от Vaste Посмотреть сообщение
А мне надо ОДНОГО
по какому принципу выбирается ОДИН при прочих равных?
Сори, невнимательно прочитал.
Тут будет зависеть от языковых настроек - MAX(ФИО)
0
3203 / 1941 / 689
Регистрация: 02.06.2013
Сообщений: 4,755
04.11.2013, 11:42 8
1.
T-SQL
1
2
3
4
5
6
7
8
9
10
select
 b.book_id,
 b.BookName,
 t.AuthorsList
from
 Books b cross apply
 (
  select
   stuff((select ', ' + a.AuthorName from BooksAuthors ba join Authors a on a.author_id = ba.author_id where ba.book_id = b.book_id order by a.AuthorName for xml path(''), type).value('.', 'varchar(200)'), 1, 2, '')
 ) t(AuthorsList);
2.
T-SQL
1
2
3
4
5
6
7
8
9
10
11
select top (1) with ties
 b.book_id,
 b.BookName,
 a.AuthorName,
 ba.Percentage
from
 Books b join
 BooksAuthors ba on ba.book_id = b.book_id join
 Authors a on a.author_id = ba.author_id
order by
 row_number() over (partition by b.book_id order by ba.Percentage desc, a.AuthorName);
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2013, 11:42

Сложный запрос
Сгруппировать по keyGroup. Если в группе больше одной записи Если в группе есть хоть одна...

сложный запрос
Есть таблица А: id | date | number, id - int date - datetime number - int, 0, 1 или 2 ...

Сложный запрос
Здравствуйте!у меня есть БД: Успеваемость(#Nз, #ИдКурса, #Семестр, #УчНед, #ВидОтчета, Оценка)...

Сложный запрос
Не получается реализовать запрос. По идеи я обращаюсь к таблице с консолид.лицами, которые...

Сложный SQL запрос!
Всем доброго времени суток! Возникла проблема в написании SQL запроса. Суть такова, имеется ...

Сложный мега запрос
Помогите пожалуйста, мне нужно стделать так как написано в третем задании и нужно чтоб дата и склад...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru