【问题标题】:How to select average from row result on oracle?如何从oracle的行结果中选择平均值?
【发布时间】:2022-01-07 16:11:52
【问题描述】:

我正在尝试从结果中计算平均值,然后加入它们。

我的主要查询在这里:

 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) /删除了马特和简的结果/

如何创建要计算的查询?是否可以根据结果计算平均值?

【问题讨论】:

  • 解释你所说的“太低”是什么意思。我无法添加该逻辑,因为没有“太低”的逻辑描述。

标签: sql oracle join select average


【解决方案1】:

就这么简单:

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
;

这些是窗口函数。

您可以随意从派生表中或在外部 WHERE 子句中的派生表之后删除任何行(您可以添加)。

【讨论】:

  • 它正在工作:) 但我怎样才能删除以上 2 行?你的意思是可以放这样的东西A.TOTAL &gt; 20
  • @Solution 当然,如果这就是“太低”的意思,您可以添加该逻辑。
猜你喜欢
  • 2019-05-07
  • 2022-11-25
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
相关资源
最近更新 更多