如何 select 从 oracle 的行结果中取平均值?
How to select average from row result on oracle?
我正在尝试根据结果计算平均值然后加入它们。
我的主要查询在这里:
SELECT
A.USERNAME,
A.TOTAL,
A.MATH
FROM
(SELECT
B.USERNAME,
COUNT(CLASS_ID) TOTAL,
SUM(CASE WHEN ROOM_ID = '1001' THEN 1 ELSE 0 END) AS MATH
FROM A LESSON, STUDENT B
WHERE
A.USERNAME = B.USERNAME
AND A.CREATED_DATE >= TO_DATE(:created_date ,'YYYYMMDDHH24MISS')
AND A.CREATED_DATE < TO_DATE(:created_end_date ,'YYYYMMDDHH24MISS')
GROUP BY B.USERNAME
ORDER BY TOTAL DESC) A
它给了我:
|USERNAME|TOTAL|MATH|
|John | 480|159 |
|Dave | 360|120 |
|Sarah | 540|130 |
|James | 361|185 |
|Kim | 640|92 |
|Matt | 11 |2 |
|Jane | 8 |1 |
但我想要这样:
|USERNAME|TOTAL|AVG_FROM_TOTAL|MATH|AVG_FROM_MATH|
|John | 480| 476 | 159| 137 |
|Dave | 360| 476 | 120| 137 |
|Sarah | 540| 476 | 130| 137 |
|James | 361| 476 | 185| 137 |
|Kim | 640| 476 | 92| 137 |
人工计算是这样的
- (480+360+540+361+640/5 = 476) /将删除用户Matt和Jane
因为别人太低了/
- (159+120+130+185+92/5 = 137) /删除马特和简结果/
如何创建要计算的查询?是否可以根据结果计算平均值?
就这么简单:
SELECT A.USERNAME
, A.TOTAL
, AVG(A.TOTAL) OVER () AS avg_total
, A.MATH
, AVG(A.MATH) OVER () AS avg_math
FROM (your derived table) A
WHERE A.TOTAL > 20
;
这些是 window 个函数。
您可以随意从派生 table 或派生 table 中的外部 WHERE 子句(您可以添加)中删除任何行。
我正在尝试根据结果计算平均值然后加入它们。
我的主要查询在这里:
SELECT
A.USERNAME,
A.TOTAL,
A.MATH
FROM
(SELECT
B.USERNAME,
COUNT(CLASS_ID) TOTAL,
SUM(CASE WHEN ROOM_ID = '1001' THEN 1 ELSE 0 END) AS MATH
FROM A LESSON, STUDENT B
WHERE
A.USERNAME = B.USERNAME
AND A.CREATED_DATE >= TO_DATE(:created_date ,'YYYYMMDDHH24MISS')
AND A.CREATED_DATE < TO_DATE(:created_end_date ,'YYYYMMDDHH24MISS')
GROUP BY B.USERNAME
ORDER BY TOTAL DESC) A
它给了我:
|USERNAME|TOTAL|MATH|
|John | 480|159 |
|Dave | 360|120 |
|Sarah | 540|130 |
|James | 361|185 |
|Kim | 640|92 |
|Matt | 11 |2 |
|Jane | 8 |1 |
但我想要这样:
|USERNAME|TOTAL|AVG_FROM_TOTAL|MATH|AVG_FROM_MATH|
|John | 480| 476 | 159| 137 |
|Dave | 360| 476 | 120| 137 |
|Sarah | 540| 476 | 130| 137 |
|James | 361| 476 | 185| 137 |
|Kim | 640| 476 | 92| 137 |
人工计算是这样的
- (480+360+540+361+640/5 = 476) /将删除用户Matt和Jane 因为别人太低了/
- (159+120+130+185+92/5 = 137) /删除马特和简结果/
如何创建要计算的查询?是否可以根据结果计算平均值?
就这么简单:
SELECT A.USERNAME
, A.TOTAL
, AVG(A.TOTAL) OVER () AS avg_total
, A.MATH
, AVG(A.MATH) OVER () AS avg_math
FROM (your derived table) A
WHERE A.TOTAL > 20
;
这些是 window 个函数。
您可以随意从派生 table 或派生 table 中的外部 WHERE 子句(您可以添加)中删除任何行。