【问题标题】:Oracle SQL - How to divide a count by the sum of a count?Oracle SQL - 如何将计数除以计数的总和?
【发布时间】:2016-09-28 10:46:53
【问题描述】:

我有一个查询,目前看起来像这样(简化)

 SELECT
       m.academicyr,
       m.ncyeargrp_format AS YEAR,
       Count(*) AS cohort,
       round (Avg (m.per_att),4) AS attendance,
       Round (per_cohort,4)      

   FROM
 (
   SELECT
         s.academy,
         s.academicyr,
         s.adno,
         s.ncyeargrp_format,
         CASE WHEN a.possible_att_marks = 0 THEN NULL
           ELSE (a.present_att_marks / a.possible_att_marks)
             END
               AS per_att,
         a.possible_att_marks,
         a.present_att_marks,
         a.period,
         Count (*) AS cohort,
         Count (*) / Sum(Count(*)) AS per_cohort

   FROM
      VACADEMY_STU_all  s

   LEFT JOIN
        vacademy_attendance a
       ON s.academy = a.academy
      AND s.adno = a.adno
      AND s.term = a.period
      AND s.academicyr = a.academicyr

   WHERE
          s.academy = 'CAN'
          AND s.academicyr = '1617'
          AND a.period = '1'

          GROUP BY
         s.academy,
         s.academicyr,
         s.adno,
         s.ncyeargrp_format,
         a.possible_att_marks,
         a.present_att_marks,
         a.period

  ) m
          GROUP BY
          m.academicyr,
          m.ncyeargrp_format,
          m.per_cohort

          ORDER BY
          To_Number(Trim(regexp_replace(m.ncyeargrp_format, '[A-Za-z]')))

我在这里尝试将计数*除以计数*的总和。我收到一个错误“不是单个组函数”。

在第一个选择中没有“Round (Per_cohort,4)”的情况下,查询工作得非常好,并且还从内部选择和分组依据中删除。

我期待的结果是

年组 % 的 Cohort Ave Att 第 7 年 126 18.18% 98.10% 第 8 年 139 20.06% 93.88% 第 9 年 143 20.63% 90.56% 10 年 143 20.63% 95.94% 11 年 142 20.49% 88.45% 总计 693 100.00% 93.28%

我的所有其他列都运行良好,我只需要对同期群进行百分比计算,因此同期群列中的值除以已使用 count * 创建的同期群列的总数。

非常感谢任何帮助。

谢谢

【问题讨论】:

  • 抱歉格式化,我不知道如何更改它。
  • 编辑时标记代码并点击{}
  • 您只需要在选择列表中按您想要的相同值进行分组;因此,如果您需要提取舍入值,请按舍入值分组
  • 在您的外部选择中将 Round (per_cohort,4) 更改为 Round (sum(per_cohort),4)。
  • 您没有对这种情况进行分组

标签: sql oracle count sum divide


【解决方案1】:

如果这是出现错误的行:

     Count (*) / Sum(Count(*)) AS per_cohort

然后你可以使用窗口函数来解决这个问题:

     Count (*) / Sum(Count(*)) over () AS per_cohort

【讨论】:

  • 我试过用这个,但不幸的是它也不起作用。
【解决方案2】:
WITH cte AS
(
    SELECT s.academy,
           s.academicyr,
           s.adno,
           s.ncyeargrp_format,
           CASE WHEN a.possible_att_marks = 0 THEN NULL
                ELSE (a.present_att_marks / a.possible_att_marks)
           END AS per_att,
           a.possible_att_marks,
           a.present_att_marks,
           a.period,
           COUNT(*) AS cohort
    FROM VACADEMY_STU_all s
    LEFT JOIN vacademy_attendance a
        ON s.academy = a.academy AND
           s.adno = a.adno AND
           s.term = a.period AND
           s.academicyr = a.academicyr
    WHERE s.academy = 'CAN' AND
          s.academicyr = '1617' AND
          a.period = '1'
    GROUP BY s.academy,
             s.academicyr,
             s.adno,
             s.ncyeargrp_format,
             a.possible_att_marks,
             a.present_att_marks,
             a.period
)

SELECT m.academicyr,
       m.ncyeargrp_format AS YEAR,
       m.cohort,
       ROUND(AVG(m.per_att), 4) AS attendance,
       ROUND(m.cohort / (SELECT SUM(cohort) FROM cte), 4)
FROM cte m
GROUP BY m.academicyr,
         m.ncyeargrp_format,
         m.per_cohort
ORDER BY TO_NUMBER(TRIM(REGEXP_REPLACE(m.ncyeargrp_format, '[A-Za-z]')))

【讨论】:

  • FROM (with cte AS (SELECT s.academy, s.academicyr, s.adno, s.ncyeargrp_format, CASE WHEN a.possible_att_marks = 0 THEN NULL ELSE (a.present_att_marks / a.possible_att_marks) END AS per_att, a.possible_att_marks, a.present_att_marks, a.period, Count () / Sum(Count()) OVER () AS per_cohort ) SELECT cte.cohort / (SELECT Sum(cohort)来自 cte)
  • 我试着把我所做的放在上面,但是格式太糟糕了,抱歉。无论如何,它不起作用,因为我认为我没有把它放在正确的地方。
  • 我已经用我想到的完整查询更新了我的答案。
  • 您好,感谢您的帮助。这不是完整的查询,因为它是一个嵌套查询。我在它前面有这个,这导致它失败。
  • SELECT m.academicyr, m.ncyeargrp_format AS YEAR, Count(*) AS 队列, round (Avg (m.per_att),4) AS 出勤率, m.period, Round (m.per_cohort, 4) 来自 (
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
相关资源
最近更新 更多