iriyawin / plc_test

0 stars 0 forks source link

Задача 5 #5

Open iriyawin opened 6 years ago

iriyawin commented 6 years ago

Имеется таблица с данными по платежным документам. Необходимо написать запрос, который выведет все документы того типа, которого за все время было по сумме больше всего. Если таких типов несколько, то вывести все такие типы. Для каждой строки результата вывести промежуточную сумму платежей данного типа от самого раннего до текущего платежа включительно.
create​ ​table​ ​payments​ (​id​ ​number​, ​pay_type​ ​NUMBER​, ​pay_date date​, ​pay_sum​ ​number​);
ID PAY_TYPE PAY_DATE PAY_SUM 1 1 01.01.2012 100 2 1 02.01.2012 200 3 1 03.01.2012 300 4 1 01.02.2012 400 5 1 01.02.2012 500 6 2 01.01.2012 600 7 2 01.02.2012 700 8 2 01.04.2012 800 9 2 01.05.2012 900 10 2 01.06.2012 1000 11 3 10.01.2012 1100 12 3 01.03.2012 1200 13 3 01.05.2012 1300 14 3 05.05.2012 1400 15 3 01.06.2012 1500
Требуемый результат: ID PAY_TYPE PAY_DATE PAY_SUM SM 11 3 10.01.2012 1100 1100 12 3 01.03.2012 1200 2300 13 3 01.05.2012 1300 3600 14 3 05.05.2012 1400 5000 15 3 01.06.2012 1500 6500

iriyawin commented 6 years ago

select *, (select sum(e.pay_sum) from payments e where (e.pay_type = a.pay_type) and ((e.pay_date < a.pay_date) or (e.pay_date = a.pay_date) and (e.id <= a.id)) ) as SM from payments a where (a.pay_type in (select pay_type --, sum(pay_sum) from payments b group by pay_type having (sum(pay_sum) = (select top 1 sum(pay_sum) from payments d group by pay_type order by sum(pay_sum) desc)) )) order by a.pay_date, a.id