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