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.
| Author |
Topic |
|
sureshsmanian
Starting Member
31 Posts |
Posted - 2009-11-03 : 10:28:12
|
| hii have three tables.StudentMaster - Regno(PK), NameMarkEntry - EntryId(PK), Regno(FK - refers studentmaster), Subid(FK- refers subject master), MarkSubjectMaster - Subid(PK), Subjectname, Maxmark, MinmarkI need the output in the following mannerSno Regno Name S1name S1mark S2name S2mark S3name S3mark s4name S4mark 1 1001 abc Lang 90 Maths 97 Scien 86 social 672 1002 pqr Bio 45 Phy 40 Mat 37 Che 43here i refer s1,s2... as subject1, subject2 etc.Can anyone help me.Thanks in advanceRegardsSSM |
|
|
sql-programmers
Posting Yak Master
190 Posts |
Posted - 2009-11-18 : 17:30:38
|
| Try to use this queryDECLARE @Query NVARCHAR(MAX), @Count int, @iC intset @Count=( SELECT top 1 count(Subjectname) FROM SubjectMaster INNER JOIN MarkEntry ON SubjectMaster.Subid=MarkEntry.Subid INNER JOIN StudentMaster ON StudentMaster.Regno=MarkEntry.Regno group by StudentMaster.Regno order by count(Subjectname) desc)set @iC=1set @Query=''set @Query='create table T(RegNo int,Name varchar(50)'WHILE @Count > 0BEGIN SET @Query = @Query + ',[S' + convert(varchar,@iC)+ '] varchar(100),[M' + convert(varchar,@iC) + '] int' set @Count=@Count-1 set @iC=@iC+1ENDset @Query=@Query+')'execute (@Query)DECLARE @IQuery NVARCHAR(MAX), @IQuery1 NVARCHAR(MAX), @RegNo as int, @Name as varchar(50), @Subject as varchar(100), @Mark as int, @Flag as int, @ID intset @iC=1set @Flag=0set @ID=0DECLARE Cur CURSOR FOR SELECT StudentMaster.Regno, [Name], Subjectname, Mark FROM SubjectMaster INNER JOIN MarkEntry ON SubjectMaster.Subid=MarkEntry.Subid INNER JOIN StudentMaster ON StudentMaster.Regno=MarkEntry.RegnoOPEN CurFETCH NEXT FROM Cur INTO @RegNo, @Name, @Subject, @MarkWHILE @@FETCH_STATUS = 0BEGIN if @ID <> @RegNo begin if @ID<>0 begin set @Flag=1 end set @ID = @RegNo end if @Flag=0 and @iC=1 begin SET @IQuery ='insert into T(RegNo,Name,[S' + convert(varchar,@iC)+ '],[M' + convert(varchar,@iC) + ']' SET @IQuery1 ='values(' + convert(varchar,@RegNo) + ','''+ @Name + ''','''+ @Subject + ''',' + CONVERT(varchar,@Mark) set @iC=@iC+1 end else if @Flag=0 begin SET @IQuery = @IQuery+',[S' + convert(varchar,@iC)+ '],[M' + convert(varchar,@iC) + ']' SET @IQuery1 = @IQuery1+ ','''+ @Subject + ''',' + CONVERT(varchar,@Mark) set @iC=@iC+1 end else begin SET @IQuery = @IQuery+')' SET @IQuery1 = @IQuery1+')' execute(@IQuery + ' ' + @IQuery1) Set @Flag=0 set @iC=1 SET @IQuery ='insert into T(RegNo,Name,[S' + convert(varchar,@iC)+ '],[M' + convert(varchar,@iC) + ']' SET @IQuery1 ='values(' + convert(varchar,@RegNo) + ','''+ @Name + ''','''+ @Subject + ''',' + CONVERT(varchar,@Mark) set @iC=2 end FETCH NEXT FROM Cur INTO @RegNo, @Name, @Subject, @MarkENDCLOSE CurDEALLOCATE CurSET @IQuery = @IQuery+')'SET @IQuery1 = @IQuery1+')'execute(@IQuery + ' ' + @IQuery1)select * from T drop table TSQL Server Programmers and Consultantshttp://www.sql-programmers.com/ |
 |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2009-11-22 : 01:00:45
|
| will you certain on number of subjects always? or else you want to use dynamic sql for this. see belowhttp://sqlblogcasts.com/blogs/madhivanan/archive/2007/08/27/dynamic-crosstab-with-multiple-pivot-columns.aspx |
 |
|
|
|
|
|
|
|