SQL sum与条件字段='x'

时间:2014-09-09 12:00:49

标签: sql sum conditional-statements

我有两张表来注册TESTSGRADES

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的等级?

7 个答案:

答案 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

Working Example

答案 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_question

TEST自然加入GRADE

按id_test分组

其中id_test = 2;