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

Откуда:
Сообщений: 7
Здравствуйте, участники форума.

Прошу у Вас помощи в составлении SQL запроса.

Задача выглядит так:

1)Есть таблица Students.
В ней, среди прочих полей, есть поле StdID - int - ключевое поле таблицы.

2)Есть таблица Results.
с полями
ResID - int (ключевое поле таблицы),
StudentID - int (связь с полем StdID таблицы Students),
ResNumber - int,
ResType - varchar(10) (данное поле может принимать значения 'Тип-1' или 'Тип-2'),

3)Сама связь данных между таблицами выглядит так:
Одна строка с ключом StdID в таблице Students может быть связана:
- c одной строкой в таблице Results со значением 'Тип-1' в поле ResType,
- c одной строкой в таблице Results со значением 'Тип-2' в поле ResType,
- c двумя строками в таблице Results со значениями 'Тип-1' и 'Тип-2' в поле ResType,
- или вообще не иметь связанных строк в таблице Results.

4)Необходимо получить результат:
StudentID - StudentID из таблицы Students
FullResult - поле varchar(), вычисляемое по таблице Rusults и состоящее из двух слагаемых:

FullResult = '№'+Number(строки где ResType='Тип-1')+' Тип-1' +
'№'+Number(строки где ResType='Тип-2')+' Тип-2'

если для конкретного StudentID строки сResType = 'тип-1' нет, то первая часть слагаемого отсутствует,
если для конкретного StudentID строки сResType = 'тип-2' нет, то вторая часть слагаемого отсутствует,
если для конкретного StudentID строк сResType = 'тип-1' и 'тип-2' нет, то FullResult = NULL.
23 ноя 17, 13:13    [20977683]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, написать запрос  [new]
Cammomile
Member

Откуда:
Сообщений: 1212
У тебя ошибка в названии темы. "Сделайте за меня работу" <> "Помогите написать запрос"
23 ноя 17, 13:21    [20977717]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, написать запрос  [new]
Добрый Э - Эх
Guest
student98,

Тынц
23 ноя 17, 13:26    [20977733]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, написать запрос  [new]
student98
Member

Откуда:
Сообщений: 7
т.е. результат будет выглядеть так:

К сообщению приложен файл. Размер - 25Kb
23 ноя 17, 13:27    [20977734]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, написать запрос  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20231
Используй функцию COALESCE().
23 ноя 17, 13:28    [20977737]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, написать запрос  [new]
student98
Member

Откуда:
Сообщений: 7
автор
У тебя ошибка в названии темы. "Сделайте за меня работу" <> "Помогите написать запрос"


да я и не спорю, так и есть.

Я подумал - вдруг кто подскажет что и как. Я вот открыл учебник в SQL и не могу понять в какой раздел смотреть.
А времени то уже и нет - надо было сегодня утром уже решение иметь.


автор
Используй функцию COALESCE().


Спасибо. Буду смотреть.
23 ноя 17, 13:40    [20977758]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, написать запрос  [new]
student98
Member

Откуда:
Сообщений: 7
Кое-что я понял

запрос типа

select t1.stdID, t2.fullresult
from Students t1
LEFT JOIN
(SELECT StudentID ,'№'+ResNumber+' '+ ResType as fullresult FROM Results WHERE del=0) t2
ON t1.stdID = t2.StudentID

вернет мне почти нужный результат.

Но в случае, если у одного студента будет два вида результата 'Тип-1' и 'Тип-2' то в результате вышеприведенного запроса
этот студент будет указан дважды, в двух разных строках.

Подскажите, вот в таком случае, как эти две строки сложить в одну? COALESCE() тут не подходит.

К сообщению приложен файл. Размер - 8Kb
23 ноя 17, 14:45    [20977979]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, написать запрос  [new]
student98
Member

Откуда:
Сообщений: 7
Вот если был аналог SUM(), но для строк...
23 ноя 17, 15:31    [20978232]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, написать запрос  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1173
student98,

Поищите по форуму конкатенация строк. Вопрос уже много раз поднимался, методов решений уйма
23 ноя 17, 15:34    [20978244]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, написать запрос  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20231
student98
Вот если был аналог SUM(), но для строк...
Для строго двух записей? нет, серьёзно? а просто взять две копии таблицы - не?
23 ноя 17, 15:46    [20978325]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, написать запрос  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20231
На, смотри: http://www.sqlfiddle.com/#!6/98316/1/0
23 ноя 17, 15:54    [20978369]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, написать запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
В SQL2017 - STRING_AGG() есть...
23 ноя 17, 15:55    [20978382]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, написать запрос  [new]
student98
Member

Откуда:
Сообщений: 7
автор
Для строго двух записей?

Это сейчас их пока только два вида. Потом в любой момент могут появиться и другие.

автор
В SQL2017 - STRING_AGG() есть...

Спасибо! В рассматриваемом случае версия 2008R2.
23 ноя 17, 16:14    [20978480]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, написать запрос  [new]
student98
Member

Откуда:
Сообщений: 7
автор
На, смотри: http://www.sqlfiddle.com/#!6/98316/1/0

Большое спасибо!!!
23 ноя 17, 16:32    [20978568]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, написать запрос  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
iap
В SQL2017 - STRING_AGG() есть...

Хочется злобно плюнуть вам в спину, завидуя счастью...
24 ноя 17, 18:33    [20981905]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить