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

Откуда:
Сообщений: 83
Доброе время суток. При выводе запроса, у студента несколько тестов с результатами. В каждой строке отображается студент, тест, и его результат. Если студент проходил несколько тестов, то будет несколько строк с этим же студентом и с другим тестом. Хотелось бы как то все объединить средствами SQL в одну строчку. Т.е. студент, тест результат, тест 2 результат. Как это можно сделать? Если необходимо могу показать свой написанный запрос
28 сен 17, 22:07    [20830279]     Ответить | Цитировать Сообщить модератору
 Re: Повторяющиеся строки  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
go to FAQ
28 сен 17, 23:24    [20830472]     Ответить | Цитировать Сообщить модератору
 Re: Повторяющиеся строки  [new]
982183
Member

Откуда: VL
Сообщений: 3353
t1975453
Если необходимо могу показать свой написанный запрос

Показывай.

Число тестов ограничено?
29 сен 17, 02:55    [20830632]     Ответить | Цитировать Сообщить модератору
 Re: Повторяющиеся строки  [new]
t1975453
Member

Откуда:
Сообщений: 83
982183
Показывай.


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

CREATE procedure [dbo].[sp_StudentsTesting]
	@key varchar(8),
	@id_group varchar(max)
as
	with query(student,id_groups,groups,last,first,middle,branch,theme,question,[right],[all]) as
	(
	select	st.id_student [student],
			eg.id [id_groups],
			eg.name [groups],
			sts.last_name [last],
			sts.first_name [first],
			sts.middle_name [middle],
			tt.id_branch [branch],
			tq.id_testing_theme [theme],
			stq.id_testing_question [question],
			sum(stq.is_right) [right],
			count(stq.is_right) [all]
		from EducationGroup eg
			left join EducationPlanGroup epg on epg.id_education_group=eg.id
			left join Students sts on sts.id_group=epg.id
			left join StudentsTesting st on st.id_student=sts.id
			left join StudentsTestingQuestion stq on stq.id_students_testing=st.id
			left join TestingQuestion tq on tq.id=stq.id_testing_question
			left join TestingTheme tt on tt.id=tq.id_testing_theme
			
		where st.is_education=0 and stq.[status]=1
			and (
					(len(@key)=4 and @key=convert(varchar,YEAR(st.date_start)))
					or (len(@key)=6 and @key=convert(varchar,YEAR(st.date_start))+right('0'+convert(varchar,month(st.date_start)),2))
					or (len(@key)=8 and @key=convert(varchar,YEAR(st.date_start))+right('0'+convert(varchar,month(st.date_start)),2)+right('0'+convert(varchar,day(st.date_start)),2))
				)	
		and eg.id=@id_group
		group by st.id_student,eg.id,eg.name,sts.last_name,sts.first_name,sts.middle_name,tt.id_branch,tq.id_testing_theme,stq.id_testing_question
	)
	
	select	CONVERT(varchar,q.student) [stud],
			CONVERT(varchar,q.id_groups) [id_gr],
			CONVERT(varchar,q.groups) [gr],
			CONVERT(varchar,q.last)+' '+CONVERT(varchar,q.first)+' '+CONVERT(varchar,q.middle) [FIO],
			CONVERT(varchar,q.theme) [id_theme],
			CONVERT(varchar,q.branch) [id_branch_theme],
			t.theme [name_theme],
			SUM(q.[all]) [all_question],
			SUM(q.[right]) [right_question],
			convert(decimal(5,2),100.0*SUM(q.[right])/SUM(q.[all])) [percent] 
		from query q
			left join TestingTheme t on t.id=q.theme
		group by q.student,q.id_groups,q.groups,q.last,q.first,q.middle,q.branch,q.theme,t.theme

982183
Число тестов ограничено?


Неограниченно. Динамически вытаскивает названия тестов
29 сен 17, 06:06    [20830651]     Ответить | Цитировать Сообщить модератору
 Re: Повторяющиеся строки  [new]
982183
Member

Откуда: VL
Сообщений: 3353
Мда...
А если через PIVOT попробовать?
29 сен 17, 07:50    [20830697]     Ответить | Цитировать Сообщить модератору
 Re: Повторяющиеся строки  [new]
982183
Member

Откуда: VL
Сообщений: 3353
Много букв.
Упрости задачу до трех полей - "студент, тест, и его результат"
Покажи своё решение.

Но кажется без PIVOT здесь не обойтись.
29 сен 17, 07:53    [20830709]     Ответить | Цитировать Сообщить модератору
 Re: Повторяющиеся строки  [new]
t1975453
Member

Откуда:
Сообщений: 83
982183
Много букв.
Упрости задачу до трех полей - "студент, тест, и его результат"
Покажи своё решение.


select	CONVERT(varchar,q.last)+' '+CONVERT(varchar,q.first)+' '+CONVERT(varchar,q.middle) [FIO],
			t.theme [name_theme],
			convert(decimal(5,2),100.0*SUM(q.[right])/SUM(q.[all])) [percent] 
		from query q
			left join TestingTheme t on t.id=q.theme
		group by q.last,q.first,q.middle,t.theme

982183
Но кажется без PIVOT здесь не обойтись.


PIVOT хороший оператор, но он не умеет динамически обрабатывать. Ему явные столбцы надо указывать
29 сен 17, 08:20    [20830739]     Ответить | Цитировать Сообщить модератору
 Re: Повторяющиеся строки  [new]
982183
Member

Откуда: VL
Сообщений: 3353
Не понял откуда таблица t (Видимо названия тем)
Не вижу, чтоб данный запрос решал поставленную в начале задачу.

Если PIVOT не нравится, то можно собрать уникальные "тест", по ним создать таблицу соответствующей структуры, а потом заполнить её из исходной.
29 сен 17, 08:40    [20830766]     Ответить | Цитировать Сообщить модератору
 Re: Повторяющиеся строки  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
t1975453,
автор
PIVOT хороший оператор, но он не умеет динамически обрабатывать. Ему явные столбцы надо указывать

Dynamic sql + pivot?
29 сен 17, 08:53    [20830785]     Ответить | Цитировать Сообщить модератору
 Re: Повторяющиеся строки  [new]
iiyama
Member

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

Кац предлагает сдаться(с) разворачивать на клиенте
29 сен 17, 10:54    [20831094]     Ответить | Цитировать Сообщить модератору
 Re: Повторяющиеся строки  [new]
aleksrov
Member

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

Т.е. тащить на клиент кучу инфы и там уже с ней работать, вам не кажется что это мягко говоря неправильно?
29 сен 17, 11:39    [20831258]     Ответить | Цитировать Сообщить модератору
 Re: Повторяющиеся строки  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
aleksrov
iiyama,

Т.е. тащить на клиент кучу инфы и там уже с ней работать, вам не кажется что это мягко говоря неправильно?

вы удивитесь, но есть масса средств которые именно это и требуют, начиная от простых PivotGrid до BI без связов с ssas
29 сен 17, 11:40    [20831266]     Ответить | Цитировать Сообщить модератору
 Re: Повторяющиеся строки  [new]
aleksrov
Member

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

Эт, понятно. Но зачем это делать когда можно все решить на сервере.
29 сен 17, 11:51    [20831297]     Ответить | Цитировать Сообщить модератору
 Re: Повторяющиеся строки  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
aleksrov
TaPaK,

Эт, понятно. Но зачем это делать когда можно все решить на сервере.

Да можно даже кофе греть на сервере, кто ж запретит
29 сен 17, 11:53    [20831308]     Ответить | Цитировать Сообщить модератору
 Re: Повторяющиеся строки  [new]
982183
Member

Откуда: VL
Сообщений: 3353
t1975453
PIVOT хороший оператор, но он не умеет динамически обрабатывать. Ему явные столбцы надо указывать


Вот тут сделали

20854972
10 окт 17, 04:36    [20856322]     Ответить | Цитировать Сообщить модератору
 Re: Повторяющиеся строки  [new]
982183
Member

Откуда: VL
Сообщений: 3353
Вру. Наоборот сделали.
10 окт 17, 04:38    [20856323]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить