我如何在不使用JOIN的情况下解决SQL中的问题?


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
  1. rate = (type = 1/all list) group by class
  2. 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…

如果这对你来说还不够,请更准确地说明你到底想做什么。

相关内容

  • 没有找到相关文章

最新更新