Please start any new threads on our new site at https://forums.sqlteam.com. We've got lots of great SQL Server experts to answer whatever question you can come up with.

 All Forums
 SQL Server 2005 Forums
 Transact-SQL (2005)
 Problem with pivot

Author  Topic 

chravikishore
Starting Member

4 Posts

Posted - 2009-01-13 : 10:59:11
hi,
i have tables as defined blelow

DECLARE @stu_Personal_Details TABLE (PersonalDetail_Id INT IDENTITY,Student_Id INT,First_Name VARCHAR(20),Last_Name VARCHAR(20))
INSERT INTO @stu_Personal_Details
SELECT 1,'First Name','Last Name' UNION ALL
SELECT 2,'First Name1','Last Name1' UNION ALL
SELECT 3,'First Name2','Last Name2'

SELECT * FROM @stu_Personal_Details


DECLARE @stu_Acadamic_Details TABLE (Student_Id INT IDENTITY,Admission_No INT ,Medium_Id INT,Class_Id INT,Section_Id INT,Roll_No INT)
INSERT INTO @stu_Acadamic_Details
SELECT 1,1,1,1,10001 UNION ALL
SELECT 2,1,1,1,10002 UNION ALL
SELECT 3,1,1,2,10004

SELECT * FROM @stu_Acadamic_Details


DECLARE @Subjects TABLE (Subject_Id INT IDENTITY, Class_Id INT, Medium_Id INT, Section_Id INT, Description VARCHAR(20))
INSERT INTO @Subjects
SELECT 1,1,1,'Sub1' UNION ALL
SELECT 1,1,1,'Sub2' UNION ALL
SELECT 1,1,1,'Sub3' UNION ALL
SELECT 1,1,1,'Sub4' UNION ALL
SELECT 1,1,1,'Sub5' UNION ALL
SELECT 1,1,1,'Sub6' UNION ALL
SELECT 1,1,2,'Sub1'
SELECT * FROM @Subjects


DECLARE @ExamTypes TABLE (ExamType_Id INT IDENTITY, Class_Id INT, Medium_Id INT, Section_Id INT, Description VARCHAR(20))
INSERT INTO @ExamTypes
SELECT 1,1,1,'First Unit'
SELECT * FROM @ExamTypes

DECLARE @Marks TABLE (MarksDetailsId INT IDENTITY, Student_Id INT, ExamType_Id INT, Subject_Id INT, Marks INT)
INSERT INTO @Marks
SELECT 1,1,1,1 UNION ALL
SELECT 1,1,2,2 UNION ALL
SELECT 1,1,3,3 UNION ALL
SELECT 1,1,4,4 UNION ALL
SELECT 1,1,5,5 UNION ALL
SELECT 1,1,6,6 UNION ALL
SELECT 2,1,1,6 UNION ALL
SELECT 2,1,2,5 UNION ALL
SELECT 2,1,3,4 UNION ALL
SELECT 2,1,4,3 UNION ALL
SELECT 2,1,5,2 UNION ALL
SELECT 2,1,6,1
SELECT * FROM @Marks


I need the output as following format


AdmissionNo RollNo Name Sub1 Sub2 Sub3 Sub4 Sub5 Sub6 Total
1 10001 First Name Last Name 1 2 3 4 5 6 21
2 10002 First Name1LastName1 6 5 4 3 2 1 21

any one help me...

visakh16
Very Important crosS Applying yaK Herder

52326 Posts

Posted - 2009-01-13 : 11:44:15
[code]
SELECT sad.AdmissionNo,
sad.RollNo,
COALESCE(spd.First_name + ' ','') + COALESCE(spd.Last_name,'') AS Name,
SUM(CASE WHEN s.Description='Sub1' THEN m.Marks ELSE 0 END) AS Sub1,
SUM(CASE WHEN s.Description='Sub2' THEN m.Marks ELSE 0 END) AS Sub2,
SUM(CASE WHEN s.Description='Sub3' THEN m.Marks ELSE 0 END) AS Sub3,
SUM(CASE WHEN s.Description='Sub4' THEN m.Marks ELSE 0 END) AS Sub4,
SUM(CASE WHEN s.Description='Sub5' THEN m.Marks ELSE 0 END) AS Sub5,
SUM(CASE WHEN s.Description='Sub6' THEN m.Marks ELSE 0 END) AS Sub6,
SUM(m.Marks) AS Total
FROM @stu_Acadamic_Details sad
INNER JOIN @Subjects s
ON s.Class_Id =sad.Class_Id
AND s.Medium_Id =sad.Medium_Id
AND s.Section_Id =sad.Section_Id
INNER JOIN @ExamTypes et
ON et.Class_Id =sad.Class_Id
AND et.Medium_Id =sad.Medium_Id
AND et.Section_Id =sad.Section_Id
INNER JOIN @Marks m
ON m.Student_Id =sad.Student_Id
AND m.ExamType_Id =et.ExamType_Id
AND m.Subject_Id=s.Subject_Id
INNER JOIN @stu_Personal_Details spd
ON spd.Student_Id=sad.Student_Id
WHERE et.Description='Your Exam name here'
GROUP BY sad.AdmissionNo,
sad.RollNo,
COALESCE(spd.First_name + ' ','') + COALESCE(spd.Last_name,'')
[/code]

if you dont want to filter on an exam you dont need where
Go to Top of Page

chravikishore
Starting Member

4 Posts

Posted - 2009-01-13 : 11:54:53
but the subjects may differ every time that means no of subjects may differ for different classes
Go to Top of Page

visakh16
Very Important crosS Applying yaK Herder

52326 Posts

Posted - 2009-01-13 : 12:29:47
quote:
Originally posted by chravikishore

but the subjects may differ every time that means no of subjects may differ for different classes


then you need dynamic pivot


http://sqlblogcasts.com/blogs/madhivanan/archive/2007/08/27/dynamic-crosstab-with-multiple-pivot-columns.aspx
Go to Top of Page

chravikishore
Starting Member

4 Posts

Posted - 2009-01-13 : 12:41:14
can u help me
Go to Top of Page

visakh16
Very Important crosS Applying yaK Herder

52326 Posts

Posted - 2009-01-13 : 12:46:57
try the code given in link to adapt to your case. post if you get struck.
Go to Top of Page

sodeep
Master Smack Fu Yak Hacker

7174 Posts

Posted - 2009-01-13 : 12:53:13
quote:
Originally posted by chravikishore

can u help me for my case



Visakh has already given you the link. We can't spoon feed you in every scenerio. Try and post question if you get stuck.
Go to Top of Page

PeterNeo
Constraint Violating Yak Guru

357 Posts

Posted - 2009-01-16 : 01:27:39
try this
SELECT	M.Student_Id, SUB.Description, AD.Roll_No, M.Marks
, SUM(M.Marks) OVER (PARTITION BY M.Student_Id) AS 'TotalMarks'
INTO #T_Final
FROM @Marks M
INNER JOIN @stu_Personal_Details PD ON PD.Student_Id = M.Student_Id
INNER JOIN @stu_Acadamic_Details AD ON AD.Student_Id = M.Student_Id
INNER JOIN @Subjects SUB ON SUB.Subject_Id = M.Subject_Id
AND SUB.Section_Id = AD.Section_Id
AND SUB.Medium_Id = AD.Medium_Id
WHERE M.ExamType_Id = 1
AND AD.Section_Id = 1
AND SUB.Class_Id = 1

DECLARE @StrCols VARCHAR(MAX)
DECLARE @StrSql VARCHAR(MAX)

SELECT @StrCols = '',
@StrSql= ''

SELECT @StrCols = @StrCols + ', ISNULL(MAX( CASE WHEN [Description] = ''' + [Description] + ''' THEN Marks END), 0) AS "' + [Description] + '"'
FROM (
SELECT DISTINCT [Description] FROM #T_Final
) A

PRINT @StrCols

SELECT @StrSql = '
SELECT Student_Id' + @StrCols + '
, TotalMarks
FROM #T_Final
GROUP BY Student_Id, TotalMarks'

EXEC (@StrSql)


"There is only one difference between a dream and an aim.
A dream requires soundless sleep to see,
whereas an aim requires sleepless efforts to achieve..!!"
Go to Top of Page

chravikishore
Starting Member

4 Posts

Posted - 2009-01-16 : 08:29:49
Thanks Neo
Go to Top of Page
   

- Advertisement -