sys_refcursor stored referenciado example devolver abrir sql oracle stored-procedures oracle11g cursor

sql - stored - Las 2 principales ofertas con la suma de todas las ofertas



return cursor oracle (3)

¿Alguien puede decir cómo puedo obtener los resultados de la siguiente manera?

El uso de la función dense_rank donde rango <= 2 me dará las mejores 2 ofertas.

También estoy buscando obtener ''total_offer'', que debe ser la suma de ''offer1'' y ''offer2''. cuando no hay oferta2 (p. ej .: taurus), la ''oferta total'' debe ser ''oferta1'' y ''nulo'' para ''oferta2''

Entrada:

customer make zipcode offer notes mark focus 101 250 cash mark focus 101 2500 appreciation cash mark focus 101 1000 cash mark focus 101 1500 cash offer henry 520i 21405 500 cash offer henry 520i 21405 100 cash henry 520i 21405 750 appreciation cash henry 520i 21405 100 cash mark taurus 48360 250 appreciation cash mark mustang 730 500 cash mark mustang 730 1000 Cash offer mark mustang 730 1250 appreciation cash

Salida deseada:

| CUSTOMER | MAKE | ZIPCODE | TOP_OFFER1 | notes1 | TOP_OFFER2 | notes2 | Total_offer | | henry | 520i | 21405 | 750 | appreciation cash | 500 | cash offer | 1250 | mark | focus | 101 2500 | appreciation cash | 1500 | cash offer | 4000 | mark | mustang | 730 | 1250 | appreciation cash | 1000 | cash offer | 2250 | mark | taurus | 48360 | 250 | appreciation cash | NULL | 250 |

Gracias

PD:

El siguiente enlace me dice que debe realizarse dense_rank para obtener las 2 mejores ofertas. ( Usando un procedimiento pl-sql o cursor para seleccionar los 3 primeros puestos )


Es mejor utilizar ROW_NUMBER lugar de DENSE_RANK (que puede devolver más de dos filas) más un LEAD para encontrar el segundo valor más alto

select customer, make, zipcode, TOP_OFFER1, TOP_OFFER2, TOP_OFFER1 + coalesce(TOP_OFFER2,0) as Total_offer from ( select customer, make, zipcode, offer as TOP_OFFER1, -- max offer lead(offer) over (partition by customer, make, zipped order by offer desc) as TOP_OFFER2, -- 2nd highest offer row_number() over (partition by customer, make, zipped order by offer desc) as rn from tab ) dt where rn = 1 -- only the row with the highest offer


Prueba este código ...

WITH subqueryfactoring AS (SELECT customer, make , zipcode , offer, lead(offer) over (partition BY customer, make , zipcode order by offer DESC) SecondLeadValue, row_number() over (partition BY customer, make , zipcode order by offer DESC ) rownumber FROM abc1 ) SELECT customer, make , zipcode, offer "Top Offer1 ", SecondLeadValue "Top offer 2", offer + COALESCE(SecondLeadValue,0) "Total Offer" FROM subqueryfactoring WHERE rownumber<2;


with x as (select row_number() over(partition by customer,make order by offer desc) rn, customer, make, zipcode, offer from tablename) , y as (select customer, make, zipcode, offer from x where rn <=2) , z as (select customer, make, zipcode, case when rn = 1 then offer else 0 end as offer_1, case when rn = 2 then offer else 0 end as offer_2 from y) select customer, make, zipcode, offer_1, offer_2, offer_1+offer_2 total_offer from z

Esto hace uso de cte''s recursivos para realizar su tarea.