ex:
I have a table:
idex name codequestion mark
1 A MS_HR_RI1 45
2 A MS_HR_RI2 30
3 A MS_HR_RI3 15
4 A MS_HR_RI4 5
5 A MS_HR_RI5 5
----------------------------sum 100
I want to query result:
idex name codequestion mark
1 A MS_HR_RI1 45
2 A MS_HR_RI2 30
List all record when sum(mark)<80 and sum(mark)>70. How can I do that?
(mark by case is (45+30)) please help me to write query this problem.
I'd probably create a preliminary query
that ranks the marks within each "name"
and arbitrarily uses "idex" to sort out any
ties.....
(replace "yurtable" with actual name of
your table in following query)
qryRank:
SELECT
t1.idex,
t1.[name],
t1.codequestion,
t1.mark,
(SELECT
Count(t2.mark)
FROM yurtable As t2
WHERE
t2.[name]=t1.[name]
AND
((t2.mark > t1.mark)
OR
(t2.mark=t1.mark AND t2.idex<t1.idex)) ) AS Rank
FROM yurtable AS t1;
result from your sample data:
idex [name] codequestion mark Rank
1 A MS_HR_RI1 45 0
2 A MS_HR_RI2 30 1
3 A MS_HR_RI3 15 2
4 A MS_HR_RI4 5 3
5 A MS_HR_RI5 5 4
then, use Rank to get sums for all records
less than or equal to Rank
qrySumMarksByRank
SELECT
qryRank.idex,
qryRank.[name],
qryRank.codequestion,
qryRank.mark,
qryRank.Rank,
(Select
Sum(q.mark)
FROM qryRank As q
WHERE
q.[name] = qryRank.[name]
AND
q.Rank <= qryRank.Rank) AS SumMark
FROM qryRank;
idex [name] codequestion mark Rank SumMark
1 A MS_HR_RI1 45 0 45
2 A MS_HR_RI2 30 1 75
3 A MS_HR_RI3 15 2 90
4 A MS_HR_RI4 5 3 95
5 A MS_HR_RI5 5 4 100
all that's left is to filter qrySumMarksByRank
on your criteria fro SumMark....
actually, probably not trivial, but I need to go
to work (that actually pays me)....
quick-and-dirty:
SELECT
q.idex,
q.[name],
q.codequestion,
q.mark
FROM qrySumMarksByRank As q
WHERE
q.SumMark < 80
AND
EXISTS
(SELECT
q1.idex
FROM
qrySumMarksByRank As q1
WHERE
q1.[name] = q.[name]
AND
q1.SumMark
BETWEEN
71
AND
79);