SQL ::计算聚合

时间:2015-08-20 18:14:25

标签: sql

DATABASE 
test_score(ts)

id  testid  userid  score  
1     8       16     2.30
2     8       19     5.23
3     8       2      4.5
4     21      32     5.00
5     21      46     6.78
6     21      16     3.67

test_types(tn)
id   test_name avg_points
8     Test1       10
21    Test3       10
37    Test8       10

我需要在百分比计算中得分,方法是在三个不同的列中显示结果并且用户得分得分

SELECT ts.testid, tt.test_name, 

(SELECT count(ts.userid) FROM test_score ts JOIN test_types tn ON ts.testid = tn.id WHERE (ROUND(ts.score)/tn.avg_points * 100)<50)  AS "condition1"
(SELECT count(ts.userid) FROM test_score ts JOIN test_types tn ON ts.testid = tn.id WHERE (ROUND(ts.score)/tn.avg_points * 100)BETWEEN 50 AND 70)  AS "condition2"
(SELECT count(ts.userid) FROM test_score ts JOIN test_types tn ON ts.testid = tn.id WHERE (ROUND(ts.score)/tn.avg_points * 100)>70)  AS "condition3"

FROM test_score ts JOIN test_types tn ON ts.testid = tn.id

1 个答案:

答案 0 :(得分:2)

您可以使用条件聚合执行此操作:

SELECT ts.testid, tt.test_name, 
       SUM(CASE WHEN ROUND(ts.score)/tn.avg_points * 100)<  50 THEN 1 ELSE 0
           END) as condition1,
       SUM(CASE WHEN ROUND(ts.score)/tn.avg_points * 100) BETWEEN 50 AND 70 THEN 1 ELSE 0
           END) as condition2,
       SUM(CASE WHEN ROUND(ts.score)/tn.avg_points * 100) > 70 THEN 1 ELSE 0
           END) as condition3
FROM test_score ts JOIN
     test_types tn
     ON ts.testid = tn.id
GROUP BY ts.testid, tt.test_name;