[英]Oracle SQL - How to divide a count by the sum of a count?
我有一個查詢,當前看起來像這樣(簡體)
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)'的情況下也可以正常工作,並且也從內部選擇和分組依據中刪除。
我期望的結果是
年份組螺柱計數同類人群的百分比年份7126 18.18%98.10%年份8139 20.06%93.88%年份9143 20.63%90.56%年份10143 20.63%95.94%年份11142 20.49%88.45%總計693 100.00%93.28 %
我的所有其他列均正常運行,我只需要對同類群組進行百分比計算,因此,同類群組列中的值除以同類群組列的總數(已使用count *創建)。
任何幫助,不勝感激。
謝謝
如果這是發生錯誤的行:
Count (*) / Sum(Count(*)) AS per_cohort
然后,您可以使用窗口函數來解決此問題:
Count (*) / Sum(Count(*)) over () AS per_cohort
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]')))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.