2014-10-16 2 views
0

У меня есть этот запрос:Как вставить новую строку с процентом

select t.cod_provincia as prov, COUNT(t.cod_provincia) as conto 
from clienti t 
where t.data_ins between to_date(&da_data,'ddmmrr') and to_date(&a_data,'ddmmrr') 
and t.cod_iso='ITA' 
group by t.cod_provincia 

возвращает

enter image description here

Теперь я хочу новые седловины для просмотра значения Конто в процентах для каждой строки. Я могу это сделать? Для каждой строки я хочу значение [CONTO*100]/SUM(CONTO)

+0

Какая СУБД вы используете? Oracle? –

+0

@a_horse_with_no_name да, но вы можете объяснить мне логическое решение в стандарте SQL – padibro

ответ

1
select pov, conto*100/sum(conto) over() 
    from (
     select t.cod_provincia as prov, COUNT(t.cod_provincia) as conto 
     from clienti t 
     where t.data_ins between to_date(&da_data,'ddmmrr') and to_date(&a_data,'ddmmrr') 
      and t.cod_iso='ITA' 
     group by t.cod_provincia 
     ) 
+0

thankyou! это работает! – padibro

-1
SELECT t.cod_provincia  AS prov, 
     Count(t.cod_provincia) AS conto, 
     (Count(t.cod_provincia) * 100)/Sum(cod_provincia) 
FROM clienti t 
WHERE t.data_ins between to_date(&da_data,'ddmmrr') and to_date(&a_data,'ddmmrr') 
and t.cod_iso = 'ITA' 
GROUP BY t.cod_provincia 
+0

не работает. Я пытаюсь '(граф (t.cod_provincia) * 100)/Sum (t.cod_provincia)', но у меня есть ошибка – padibro

0

Oracle имеет встроенный в аналитической функции RATIO_TO_REPORT, которые могут быть использованы в качестве альтернативы решения Расти:

select t.cod_provincia as prov, 
     count(t.cod_provincia) as conto, 
     100*RATIO_TO_REPORT(count(t.cod_provincia)) OVER() as percentage 
from clienti t 
where t.data_ins between to_date(&da_data,'ddmmrr') and to_date(&a_data,'ddmmrr') 
and t.cod_iso='ITA' 
group by t.cod_provincia 

Это дает тот же но избегает повторения выражения как числителя, так и внутри суммы в знаменателе. И вам не нужно беспокоиться о возможном делении на нулевые ошибки.