Data : Desired result:
class type number class rate score
------------------------- ----------------------
2021 1 5 2021 0.5 4.8
2021 1 4.6 2022 0.5 4.6
2021 0 4.8
2021 null null
2022 1 4.2
2022 1 5
2022 0 4.2
2022 null null
- rate = (type = 1/all list) group by class
- score = AVG(number),其中type = 1。
我想这样做:
SELECT
a.class, SUM(type) / COUNT(*) AS rate, b.score
FROM
data as a
LEFT JOIN
(SELECT
class, AVG(number) AS score
FROM
data
WHERE
type = 1
GROUP BY
class) AS b ON a.class = b.class
GROUP BY
class
是否有任何方法可以在没有JOIN的情况下做到这一点?
首先,一些问题应该命名为:
- 不使用type、number等SQL关键字作为列名、表名。
- 不排除除零例外的可能,不要做除法。
无论如何,如果你的描述是正确的,你可以这样做:
SELECT class,
ROUND(AVG(CAST(COALESCE(type,0) AS FLOAT)),2) AS rate,
ROUND(AVG(CASE WHEN type = 1 THEN COALESCE(number,0) END),2) AS score
FROM data
GROUP BY class;
您可以在这里看到它正在正常工作:db<>fiddle
一些解释:
AVG
将构建平均值而不进行风险划分。COALESCE
将NULL值替换为零以确保平均值正确。ROUND
确保平均值将显示为0.33,而不是0.33333…
如果这对你来说还不够,请更准确地说明你到底想做什么。