Reputation: 3
WHILE @i <= @stsem
BEGIN
SELECT
SUM(sb.totalmarks) AS Sub_total,
SUM(sb.credit) AS Credit_total,
SUM(a.totalmarks) AS Total_obt,
SUM(a.rankpoint) AS RP_total,
(SUM(rankpoint) / SUM(sb.credit)) AS SGPA,
@i AS Sem
FROM
umms.dbo.[dt_result] AS a
JOIN
umms.dbo.[dt_subjectdetails] AS sb ON a.paperid = sb.paperid
WHERE
studentid = 17780
AND btid = 495
AND a.semid = @i
AND (grade != 'F' OR grade != 'Ab' OR grade != 'IN')
IF @i = 10
BREAK;
SET @i = @i + 1;
END;
SELECT SUM(b.credit) as TotalCredit,SUM(rankpoint) as TotalGradepoint ,(SUM(rankpoint)/SUM(b.credit)) as CGPA FROM umms.dbo.[dt_result] as a join umms.dbo.[dt_subjectdetails] as b on a.paperid=b.paperid where studentid=17780 and btid=495
This query executes 3 times.
Upvotes: 0
Views: 98
Reputation: 71374
It seems a simple filter on a.semid
and a GROUP BY
on the same column should do the trick:
SELECT
SUM(sb.totalmarks) AS Sub_total,
SUM(sb.credit) AS Credit_total,
SUM(a.totalmarks) AS Total_obt,
SUM(a.rankpoint) AS RP_total,
(SUM(rankpoint) / SUM(sb.credit)) AS SGPA,
a.semid AS Sem
FROM
umms.dbo.[dt_result] AS a
JOIN
umms.dbo.[dt_subjectdetails] AS sb ON a.paperid = sb.paperid
WHERE
studentid = 17780
AND btid = 495
AND a.semid >= 1 AND a.semid <= 10
AND (grade != 'F' OR grade != 'Ab' OR grade != 'IN')
GROUP BY
a.semid;
The second query could potentially be combined also, by using a ROLLUP
, but the grade
and semid
filters make this more difficult.
The logic
grade != 'F' OR grade != 'Ab' OR grade != 'IN'
appears incorrect. I suggest you take a look at it.
Upvotes: 1
Reputation: 8033
You don't seem to need a loop here, try this instead
;WITH CTE
AS
(
SELECT
RN = 1
UNION ALL
SELECT
RN = RN +1
FROM CTE
WHERE RN <10
)
SELECT
SUM(sb.totalmarks) AS Sub_total,
SUM(sb.credit) AS Credit_total,
SUM(a.totalmarks) AS Total_obt,
SUM(a.rankpoint) AS RP_total,
(SUM(rankpoint) / SUM(sb.credit)) AS SGPA,
CTE.RN AS Sem
FROM
umms.dbo.[dt_result] AS a
JOIN
umms.dbo.[dt_subjectdetails] AS sb ON a.paperid = sb.paperid
JOIN CTE
ON a.semid = CTE.RN
WHERE
studentid = 17780
AND btid = 495
AND (grade != 'F' OR grade != 'Ab' OR grade != 'IN')
GROUP BY
CTE.RN
Upvotes: 0