FireMonkey92 Ответов: 2

Для решения SQL - запроса необходима помощь.


в таблице student данные представлены в следующем виде,

sID	sName	sub	marks
1	Savita	EC1	30
1	Savita	EC2	19
1	Savita	EC3	28
1	Savita	EC4	30
1	Savita	EC5	60
2	Vidya	EC1	90
2	Vidya	EC2	80
2	Vidya	EC3	85
2	Vidya	EC4	75
2	Vidya	EC5	99
3	Tanesh	EC1	75
3	Tanesh	EC2	80
3	Tanesh	EC3	85
3	Tanesh	EC4	28
3	Tanesh	EC5	86


я хочу получить записи в приведенной ниже форме с помощью sql-запроса.

Sname EC1   EC2	EC3	EC4	EC5	Total
Savita	30	19	28	30	60	167
Tanesh	75	80	85	28	86	354
Vidya	90	80	85	75	99	429


я использовал этот SQL запрос:
select fStudentname as Student_name, EC1 ,EC2,EC3,EC4,EC5,Total =([EC1]+[EC2]+[EC3]+[EC4]+[EC5]) from (select fstudentname ,FSubject ,Fmarks from Student) a PIVOT(sum(Fmarks) For fsubject in (EC1,EC2,EC3,EC4,EC5) )b


запрос работает нормально, но я не хочу использовать PIVOT, я хочу использовать JOIN. Разве это возможно?

Что я уже пробовал:

SQL-запрос, который я использовал, заключается в том, чтобы получить каждую запись. но проблема в том, что мне нужен SQL-запрос без использования каких-либо функций, таких как PIVOT и все такое. Можно ли получить записи в этой форме с помощью JOIN?? Пожалуйста, помогите мне. :)

Maciej Los

Почему? Рекомендуется использовать pivot для такой ситуации.

FireMonkey92

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

2 Ответов

Рейтинг:
11

Maciej Los

Прежде всего, пожалуйста, прочтите мой комментарий [EIDT] и ответ OriginalGriff[/EDIT].
Вот идея, как достичь этого без использования pivot.

CASE WHEN ... END решение:

SELECT fStudentname as Student_name, EC1 ,EC2,EC3,EC4,EC5,Total =([EC1]+[EC2]+[EC3]+[EC4]+[EC5])
FROM (
    SELECT fStudentname, 
        EC1 = SUM(CASE WHEN FSubject = 'EC1' THEN Fmarks ELSE NULL), 
        EC2 = SUM(CASE WHEN FSubject = 'EC2' THEN Fmarks ELSE NULL),
        EC3 = SUM(CASE WHEN FSubject = 'EC3' THEN Fmarks ELSE NULL),
        EC4 = SUM(CASE WHEN FSubject = 'EC4' THEN Fmarks ELSE NULL),
        EC5 = SUM(CASE WHEN FSubject = 'EC5' THEN Fmarks ELSE NULL) 
    FROM Student
    GROUP BY fStudentname
) AS Src


JOIN's решение:
DECLARE @student TABLE(stuID INT, fStudentname VARCHAR(30), FSubject VARCHAR(30), Fmarks INT)

INSERT INTO @student (stuID, fStudentname, FSubject, Fmarks)
VALUES(1, 'Savita', 'EC1', 30),
(1, 'Savita', 'EC2', 19),
(1, 'Savita', 'EC3', 28),
(1, 'Savita', 'EC4', 30),
(1, 'Savita', 'EC5', 60),
(2, 'Vidya', 'EC1', 90),
(2, 'Vidya', 'EC2', 80),
(2, 'Vidya', 'EC3', 85),
(2, 'Vidya', 'EC4', 75),
(2, 'Vidya', 'EC5', 99),
(3, 'Tanesh', 'EC1', 75),
(3, 'Tanesh', 'EC2', 80),
(3, 'Tanesh', 'EC3', 85),
(3, 'Tanesh', 'EC4', 28),
(3, 'Tanesh', 'EC5', 86)

SELECT fStudentname as Student_name, EC1 ,EC2,EC3,EC4,EC5,Total =([EC1]+[EC2]+[EC3]+[EC4]+[EC5])
FROM (
    SELECT A.fStudentname, A.EC1, B.EC2, C.EC3, D.EC4, E.EC5
    FROM (
		(SELECT fStudentname, SUM(Fmarks) AS EC1 FROM @student WHERE FSubject = 'EC1' GROUP BY fStudentname) AS A 
		INNER JOIN (SELECT fStudentname, SUM(Fmarks) AS EC2 FROM @student WHERE FSubject = 'EC2' GROUP BY fStudentname) AS B ON A.fStudentname = B.fStudentname
		INNER JOIN (SELECT fStudentname, SUM(Fmarks) AS EC3 FROM @student WHERE FSubject = 'EC3' GROUP BY fStudentname) AS C ON A.fStudentname = C.fStudentname
		INNER JOIN (SELECT fStudentname, SUM(Fmarks) AS EC4 FROM @student WHERE FSubject = 'EC4' GROUP BY fStudentname) AS D ON A.fStudentname = D.fStudentname
		INNER JOIN (SELECT fStudentname, SUM(Fmarks) AS EC5 FROM @student WHERE FSubject = 'EC5' GROUP BY fStudentname) AS E ON A.fStudentname = E.fStudentname
	) 
) AS Final

Примечание: тестируется на временном столе. Вы должны заменить его @student с настоящим именем таблицы.


FireMonkey92

я вставляю запрос в программное обеспечение SQL Server Manager 2008. при выполнении запроса он показывает ошибку.

Неверный синтаксис рядом с ')'

Maciej Los

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

FireMonkey92

Да, сэр, я пытаюсь сейчас использовать этот вопрос.

Maciej Los

См. обновленный ответ.

FireMonkey92

работает нормально большое спасибо:)

Maciej Los

Всегда пожалуйста

Рейтинг:
1

OriginalGriff

PIVOT-это правильный метод для этого, это именно то, для чего он предназначен.
Вы могли бы сделать это с помощью соединения - или, скорее, с довольно большим количеством соединений, - но это было бы громоздко, многословно, менее эффективно и Пита для поддержания.

Держите стержень: он работает, и это правильная вещь, чтобы использовать.


Maciej Los

1000% согласен! Вместо соединений OP может использовать SUM(CASE WHEN ...) Я не проверял, является ли CASE WHEN быстрее или медленнее pivot, но я почти уверен, что он медленнее.