我有两张表来注册TESTS
和GRADES
表TEST (id_test, id_person, retry)
表GRADE (id_grade, id_test, id_question, grade)
一个人可能进行第二次测试,在这种情况下,重试将是char' Y' (是的) 现在我需要总结按人分组的所有成绩。
问题在于,当我按人分组时,总和来自测试重试'N'
和重试'Y'
。
但是如果一个人进行了重试测试,我只想对此进行总结。
实施例
如果TEST (id_test, id_person, retry)
有值
(1,1,'N')
(2,1,'Y')
(3,2,'N')
和GRADE (id_grade, id_test, id_question, grade)
有值
(1, 1, 1, 4)
(2, 1, 2, 4)
(3, 1, 3, 4)
(4, 2, 1, 5)
(5, 2, 2, 5)
(6, 2, 3, 5)
(7, 3, 1, 7)
(8, 3, 2, 7)
(9, 3, 3, 7)
我想人#1的总和是15(5 + 5 + 5)而不是27((5 + 5 + 5)+(4 + 4 + 4))。对于没有重试的人#2,总和是21.如何获得一个人的列表和它与sql的等级?
答案 0 :(得分:0)
select id_person,sum(b.grade) from
(
select id_person,max(id_test) testid from test
group by id_person
)a
inner join GRADE as b on a.testid = b.id_test
group by id_person
答案 1 :(得分:0)
问题是你不能真正按人分组。您必须通过测试计算总和分组(这很容易),并决定要保留哪些测试以及丢弃哪些测试(这是困难的部分,特别是因为您的规格不是很清楚)。
此查询的基础是:
SELECT t.id_test, t.id_person, t.retry, SUM(g.grade) AS sum_grade
FROM test t
JOIN grade g ON g.id_test=t.id_test
HAVING <some_filter_condition>
这里的情况很大程度上取决于你没有告诉我们的一些事情。
如果您想要每个人的最后一次测试,那么您可以使用它:
SELECT t.id_test, t.id_person, t.retry, SUM(g.grade) AS sum_grade
FROM test t
JOIN grade g ON g.id_test=t.id_test
HAVING t.id_test=(
SELECT MAX(t2.id_test)
FROM test t2
WHERE t2.id_person=t.id_person)
答案 2 :(得分:0)
我认为有很多方法可以解决这个问题。我可以给你一个想法
1.获得重试者的总和= Y =&gt;结果A
2.获得结果A中id_person NOT EXISTS的人的总和
3.加入一起
4.完成了
答案 3 :(得分:0)
;WITH MyCTE AS
(
SELECT *,ROW_NUMBER()OVER(PARTITION BY id_person ORDER BY retry DESC) AS rn
FROM TEST
)
SELECT SUM(grade) AS Total
FROM MyCTE T
JOIN GRADE G
ON T.id_test = G.id_test
WHERE rn = 1
<强> SQL Fiddle 强>
答案 4 :(得分:0)
忽略这些点我会选择所有重试的测试以及所有没有重试的测试。
第一个是直截了当的:
SELECT id_test FROM test WHERE retry = 'Y';
第二个也不是那么复杂:
SELECT id_test FROM test t1 WHERE retry = 'N' and NOT EXISTS(SELECT * FROM test t2 WHERE t1.id_person=t2.id_person AND t2.retry='Y');
结合UNION,您将获得所有测试ID:
SELECT id_test FROM test WHERE retry = 'Y'
UNION
SELECT id_test FROM test t1 WHERE retry = 'N' and NOT EXISTS(SELECT * FROM test t2 WHERE t1.id_person=t2.id_person AND t2.retry='Y')
为你提供2&amp; 3.从中计算总和可以简单如下:
SELECT id_test, SUM(grade) FROM grade WHERE id_test IN (
SELECT id_test FROM test WHERE retry = 'Y'
UNION
SELECT id_test FROM test t1 WHERE retry = 'N' and NOT EXISTS(SELECT * FROM test t2 WHERE t1.id_person=t2.id_person AND t2.retry='Y')
) GROUP BY id_test;
编辑: 为了完整性,查询id_person,SUM(等级):
SELECT id_person, SUM(grade) FROM grade g JOIN (
SELECT id_test, id_person FROM test WHERE retry = 'Y'
UNION
SELECT id_test, id_person FROM test t1 WHERE retry = 'N' and NOT EXISTS(
SELECT * FROM test t2 WHERE t1.id_person=t2.id_person AND t2.retry='Y'
)
) t ON t.id_test = g.id_test
GROUP BY id_person;
答案 5 :(得分:-1)
select sum(g.grade)
from
TEST t,GRADE g
where
t.id_test = g.id_test
and
t.id_person = 1 ...
答案 6 :(得分:-1)
从
中选择SUM(成绩),id_person,id_questionTEST自然加入GRADE
按id_test分组
其中id_test = 2;