SQL::计算聚合

SQL::计算聚合,sql,Sql,我需要通过在三个不同的列中显示结果并使用count of users获得分数来计算百分比 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

我需要通过在三个不同的列中显示结果并使用count of users获得分数来计算百分比

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

@ronquiq如果你在抱怨之前尝试过解决方案,你就不会抱怨了。
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;