Вы можете использовать аналитическую функцию SUM
:
SQL Fiddle
Настройка схемы Oracle 11g R2 :
CREATE TABLE table_name ( item , gender, n ) AS
SELECT 'A', 'M', 30 FROM DUAL UNION ALL
SELECT 'A', 'F', 70 FROM DUAL UNION ALL
SELECT 'B', 'M', 100 FROM DUAL UNION ALL
SELECT 'B', 'F', 100 FROM DUAL;
Запрос 1 :
SELECT Item,
n / total AS prop_male
FROM (
SELECT t.*,
SUM( n ) OVER ( PARTITION BY Item ) AS total
FROM table_name t
)
WHERE gender = 'M'
Результаты :
| ITEM | PROP_MALE |
|------|-----------|
| A | 0.3 |
| B | 0.5 |
Вы можете даже выполнитьрасчет непосредственно по таблице с неучтенными значениями:
Настройка схемы Oracle 11g R2 :
CREATE TABLE table_name_pre_count ( item , gender ) AS
SELECT 'A', 'M' FROM DUAL CONNECT BY LEVEL <= 30 UNION ALL
SELECT 'A', 'F' FROM DUAL CONNECT BY LEVEL <= 70 UNION ALL
SELECT 'B', 'M' FROM DUAL CONNECT BY LEVEL <= 100 UNION ALL
SELECT 'B', 'F' FROM DUAL CONNECT BY LEVEL <= 100;
Запрос 2 :
SELECT Item,
prop_male
FROM (
SELECT item,
gender,
COUNT(*) / SUM( COUNT(*) ) OVER ( PARTITION BY Item )
AS prop_male
FROM table_name_pre_count
GROUP BY Item, Gender
)
WHERE gender = 'M'
Результаты :
| ITEM | PROP_MALE |
|------|-----------|
| A | 0.3 |
| B | 0.5 |