繁体   English   中英

MAX、SUM 和 AVG 都在一个 SQL 查询中?

[英]MAX, SUM then AVG all in one SQL query?

这里需要复杂的 SQL 查询,不确定是否可能。

我有一张这样的表:

------------------------
|uid |lesson_id |score |
------------------------
|1   |0         |20    |
|1   |0         |25    |
|1   |0         |15    |
|1   |0         |40    |
|1   |1         |70    |
|1   |0         |10    |
|1   |1         |20    |
|1   |1         |55    |
|1   |1         |55    |
|1   |0         |5     |
|1   |2         |65    |
------------------------

对于特定用户,我需要获得每节课的最高分,将它们相加,然后得到它们的平均值……所有这些都在一个 SQL 查询中。

最高分数:

-----------------------
|lesson_id |max_score |
-----------------------
|0         |40        |
|1         |70        |
|2         |65        |
-----------------------

和:

------
|sum |
------
|175 |
------

平均数:

-------
|avg  |
-------
|58.3 |
-------

这个怎么样?

SELECT uid AS id, AVG(max_score) AS avg_score FROM 
    (
    SELECT uid, lesson_id, max(score) AS max_score FROM cdu_user_progress 
    WHERE session_id = $session_id
    GROUP BY uid, lesson_id 
) AS tt 
WHERE uid IN ($ids) 
GROUP BY uid 
ORDER BY avg_score

您可以只使用子查询:

SELECT uid, SUM(MaxScore), Avg(MaxScore) 
FROM
(
  SELECT uid, lesson_id,max(score) as MaxScore
  FROM scores 
  GROUP BY userid, lesson_id 

) AS m
GROUP BY  uid

或仅针对一位用户:

SELECT SUM(MaxScore), Avg(MaxScore) 
FROM
(
  SELECT lesson_id,max(score) as MaxScore
  FROM scores 
  WHERE uid = $uid
  GROUP BY lesson_id 
) AS m

或者对于“一群特定用户”:

$uidlist = (comma-delimited list of user ids)

SELECT uid, SUM(MaxScore), Avg(MaxScore) 
FROM
(
  SELECT uid, lesson_id,max(score) AS MaxScore
  FROM scores 
  WHERE FIND_IN_SET(uid, $uidlist)
  GROUP BY uid, lesson_id 
) AS m
GROUP BY uid

这是一个简单的示例SQLFIDDLE

select Avg(tt.maxscores) from (
select lesson_id,max(score) as maxscores
from t
group by lesson_id ) as tt
SELECT AVG( s.scores ) AS avarage, SUM( s.scores ) AS total
FROM (

SELECT lesson_id, MAX( score ) AS scores
FROM  `tblScores` 
GROUP BY lesson_id
) AS s

您可以在单个 SQL 查询中轻松完成此操作,尽管您将需要使用多个语句

最容易的是,您可以通过子查询来完成此操作,尽管可以通过临时表或 Common-Table-Expression 来完成相同的结果。

(另外,请注意 SQL AVG函数已经对结果求和并除以它们的计数。你不想做AVG(SUM(X)) ,因为它会以一个无意义的数字结束。)无论如何,继续这个例子:

首先,编写一个 SQL 表达式来获取您将要平均的项目,例如每个用户每次测试的最大分数。

SELECT MAX(Score) As MaxScore, uid, lesson_id
FROM table
GROUP BY uid, lesson_id

然后,您将上面的 SELECT 视为一个表,并围绕它进行第二次选择以获得每个 uid 的平均 Max 分数。

SELECT AVG(MaxScore) as Final, uid 
FROM (
    SELECT MAX(Score) As MaxScore, uid, lesson_id
    FROM table
    GROUP BY uid, lesson_id
) AS subQuery
GROUP BY uid

您可以使用此方法轻松包含其他聚合函数,并且由于它相当标准,因此可以在大多数 SQL 服务器中使用。 但是,根据供应商,您可能有自定义语法来执行此操作,例如SQL Server 中的 OVER 和 Parition by

一切皆有可能,只是可能非常非常丑陋。 这是一个丑陋的代码示例,可以在单个查询中获得您想要的内容...

码查询:

SELECT lesson_id, max_score WHERE uid=X
UNION
SELECT -1, sum //done via nested query
UNION
SELECT -2, average //done via nested query

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM