Encuentre la diferencia entre la suma de cuentas dentro de algún período en Oracle -- racle camp Relacionados El problema

Find Difference between sum of accounts within some period in Oracle


0
vote

problema

Español

Necesito encontrar un cambio en alguna cuenta dentro de algún período. Supongamos que tengo varias cuentas y el dinero viene y va. Necesito encontrar suma de partida y suma final junto con la diferencia para cada cuenta única para el año 20 de noviembre.

Tengo una mesa a continuación:

  -------------------------------------------------------------------------------------------- code_filial   | oper_day      |  code_account       |   sum_in           | sum_out        | -------------------------------------------------------------------------------------------- 00116         | 2020-05-12    | 1740100126          | 187322000          | 210522000     | 00116         | 2020-05-14    | 1740100126          | 210522000          | 256582000     | 00116         | 2020-11-04    | 1740100250          |  2000000           | 52050         | 00116         | 2020-11-05    | 1740100250          | 52050              | 2872050       | 00116         | 2020-11-14    | 1740100250          | 2872050            | 5855000       | 00116         | 2020-11-30    | 1740100250          | 5855000            | 7837000       | 00116         | 2020-12-03    | 1740100250          | 7837000            | 4900000       |    

El resultado debe verse a continuación:

  ------------------------------------------------------------------------------------------------------- code_filial   | oper_day      |  code_account       |   sum_in            | sum_out        | diffrence  ------------------------------------------------------------------------------------------------------- 00116         | 2020-05-14    | 1740100126          | 256582000          | 256582000     | 256582000 00116         | 2020-11-04    | 1740100250          |    2000000         | 7837000       | 5837000   

Por ejemplo, 256582000 , en esta cuenta no se ha realizado ningún proceso en noviembre 2020 , para que debo tomar Último sum_out como Sum_in y Sum_out, la diferencia también sería igual. Pero en caso 1740100250 cuenta, en esta cuenta Se han realizado algunas operaciones, en 2020-11-04 Fecha, primera fecha en noviembre, Sum_in comenzó con 2000000 y El último día de noviembre 2020-11-30 sum_out fue 7837000 , la diferencia sería 7837000 - 2000000 = 5837000 . Probé algunas maneras pero no puedo hacer la lógica.

Original en ingles

I need to find change in some account within some period. Assume I have several accounts and money comes and goes. I need to find starting sum and ending sum along with difference for each unique accounts for november 2020 year.

I have a table like below:

-------------------------------------------------------------------------------------------- code_filial   | oper_day      |  code_account       |   sum_in           | sum_out        | -------------------------------------------------------------------------------------------- 00116         | 2020-05-12    | 1740100126          | 187322000          | 210522000     | 00116         | 2020-05-14    | 1740100126          | 210522000          | 256582000     | 00116         | 2020-11-04    | 1740100250          |  2000000           | 52050         | 00116         | 2020-11-05    | 1740100250          | 52050              | 2872050       | 00116         | 2020-11-14    | 1740100250          | 2872050            | 5855000       | 00116         | 2020-11-30    | 1740100250          | 5855000            | 7837000       | 00116         | 2020-12-03    | 1740100250          | 7837000            | 4900000       |  

Result should look like below:

------------------------------------------------------------------------------------------------------- code_filial   | oper_day      |  code_account       |   sum_in            | sum_out        | diffrence  ------------------------------------------------------------------------------------------------------- 00116         | 2020-05-14    | 1740100126          | 256582000          | 256582000     | 256582000 00116         | 2020-11-04    | 1740100250          |    2000000         | 7837000       | 5837000 

For example 256582000 account, in this account no process has been done in november 2020, so that I need to take last sum_out as sum_in and sum_out, difference would be also same. But in case 1740100250 account, in this account some operations has been done, on 2020-11-04 date,first date in november, sum_in started with 2000000 and on last day of november 2020-11-30 sum_out was 7837000, difference would be 7837000 - 2000000 = 5837000. I tried some ways but cannot make the logic.

  

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Puede usar la función %n7 y analítica con %n8 Cláusula de la siguiente manera (tenga en cuenta que no lo he probado. Simplemente creó consulta según el requisito. Necesitas Para resolver algunos errores si hay alguno)

  %n9  
 

You can use the GROUP BY and analytical function with KEEP clause as follows (Please note that I have not tested it. Just created query as per the requirement. You need to solve few errors if there are any)

select code_filal, code_account, oper_day, sum_in, sum_out,        case when is_entry_nov_exists > 0 then sum_out-sum_in else sum_out end as difference from (select code_filal, code_account, is_entry_nov_exists,         case when is_entry_nov_exists > 0               then min(case when oper_day >= date '2020-11-01' and oper_day < date '2020-12-01'                             then oper_day end)              else max(oper_day)          end as oper_day,         case when is_entry_nov_exists > 0               then max(case when oper_day >= date '2020-11-01' then sum_in end)                    keep (dense_rank first order by oper_day)              else max(sum_out)                    keep (dense_rank last order by oper_day)          end as sum_in,         case when is_entry_nov_exists > 0               then max(case when oper_day >= date '2020-11-01' then sum_out end)                    keep (dense_rank last order by oper_day)              else max(sum_out)                    keep (dense_rank last order by oper_day)          end as sum_out  from (select t.*,          count(case when oper_day >= date '2020-11-01' and oper_day < date '2020-12-01'                     then 1                end)             OVER (partition by code_filial, code_account) as is_entry_nov_exists   from your_table t   where oper_day < date '2020-12-01') t group by code_filal, code_account, is_entry_nov_exists) t 
 
 
 
 

Relacionados problema

125  ¿Hay un sistema de control de versiones para los cambios de la estructura de la base de datos?  ( Is there a version control system for database structure changes ) 
A menudo me encuentro con el siguiente problema. Trabajo en algunos cambios en un proyecto que requiere nuevas tablas o columnas en la base de datos. Hago l...

2  Nombres de tablas, y bucle para describir  ( Table names and loop to describe ) 
trabajando en Oracle 10g. Manera fácil de listar todos los nombres de las mesas (seleccione Table_Name de DBA_Tables donde el propietario = 'me') Pero ahora q...

8  Oracle Build Order y PAPES PAQUETES DEPENDENCIENCIAS DE PLA / SQL  ( Oracle build order and pl sql package dependencies ) 
Estoy tratando de crear una lista de dependencias del paquete PL / SQL para que pueda ayudar a configurar un script de compilación automatizado para que mis p...

1  Error ORA-01406 al obtener valores usando OCI  ( Ora 01406 error when fetching values using oci ) 
Esto ocurre cuando obtiene valores que tienen una longitud máxima de 50, a un tampón que solo podía contener 30 caracteres. Ya he buscado el error y encontr...

32  ¿Hay alguna manera de que el grupo de conexiones de JBoss se vuelva a conectarse a Oracle cuando las conexiones vayan mal?  ( Is there any way to have the jboss connection pool reconnect to oracle when conn ) 
Tenemos nuestro JBoss y Oracle en servidores separados. Las conexiones parecen ser eliminadas y están causando problemas con JBoss. ¿Cómo puedo hacer que el J...

17  Cómo encontrar filas bloqueadas en Oracle  ( How to find locked rows in oracle ) 
Tenemos una base de datos Oracle, y la tabla de cuentas del cliente tiene aproximadamente un millón de filas. A lo largo de los años, hemos construido cuatro ...

8  Oracle: desambiga entre la mesa y el nombre del esquema  ( Oracle disambiguate between table and schema name ) 
Supongamos que tengo esquemas A y B . En esquema A Me gustaría llamar al paquete X en el esquema B . Sin embargo, existe un paquete B en el esquem...

1  Oracle: Cómo crear un elemento en un espacio de nombres específico con XMLelement ()  ( Oracle how to create an element in a specific namespace with xmlelement ) 
En Oracle, puede usar el XMlelement () Función para crear un elemento, como en: XMLElement('name', 'John') ¿Pero cómo crear un elemento en un espacio...

50  CX_ORACE: ¿Cómo lo hago en un conjunto de resultados?  ( Cx oracle how do i iterate over a result set ) 
Hay varias formas de iterar sobre un conjunto de resultados. ¿Cuál es la compensación de cada uno? ...

1  Oracle: Cómo agregar un nodo de texto a un elemento existente  ( Oracle how to add a text node into an existing element ) 
en Oracle, puedes escribir: update t set xml = updateXML(xml, '/a/b/text()', 'gaga') Esto funciona solo si ya tiene algún texto en el elemento <b> . C...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos