varios una sumar resultados repetidos registros promedio funciones ejemplo contar consultas consulta campos agrupar agrupamiento agrupados agrupadas sql oracle grouping sum running-total

una - sql promedio varios campos



Total acumulado por registros agrupados en la tabla (3)

¿Realmente necesitas la mesa extra?

Puede obtener los datos que necesita con una simple consulta, que obviamente puede crear como vista si desea que aparezca como una tabla.

Esto le dará los datos que está buscando:

select account, bookdate, amount, sum(amount) over (partition by account order by bookdate) running_total from t /

Esto creará una vista para mostrarle los datos como si fuera una tabla:

create or replace view t2 as select account, bookdate, amount, sum(amount) over (partition by account order by bookdate) running_total from t /

Si realmente necesita la tabla, ¿quiere decir que la necesita constantemente actualizada? o solo uno? Obviamente, si es uno solo, puede simplemente "crear una tabla como seleccionar" usando la consulta anterior.

Los datos de prueba que utilicé son:

create table t(account number, bookdate date, amount number); insert into t(account, bookdate, amount) values (1, to_date(''20080101'', ''yyyymmdd''), 100); insert into t(account, bookdate, amount) values (1, to_date(''20080102'', ''yyyymmdd''), 101); insert into t(account, bookdate, amount) values (1, to_date(''20080103'', ''yyyymmdd''), -200); insert into t(account, bookdate, amount) values (2, to_date(''20080102'', ''yyyymmdd''), 200); commit;

editar:

olvidé agregar; usted especificó que quería que se ordenara la tabla, esto realmente no tiene sentido, y me hace pensar que realmente quiere decir que quería la consulta / vista, el orden es el resultado de la consulta que ejecuta, no algo que es inherente a la tabla (ignorando tablas organizadas por índices y similares).

Tengo una mesa como esta (Oracle, 10)

Account Bookdate Amount 1 20080101 100 1 20080102 101 2 20080102 200 1 20080103 -200 ...

Lo que necesito es una tabla nueva agrupada por orden de Cuenta por cuenta asc y asc fecha de libro con un campo de total acumulado, como este:

Account Bookdate Amount Running_total 1 20080101 100 100 1 20080102 101 201 1 20080103 -200 1 2 20080102 200 200 ...

¿Hay una manera simple de hacerlo?

Gracias por adelantado.


Comenzaré con esta importante advertencia: NO cree una tabla para contener esta información. Cuando lo haga, encontrará que necesita mantenerlo, que se convertirá en un dolor de cabeza sin fin. Escribe una vista para devolver la columna adicional si quieres hacer eso. Si está trabajando con un almacén de datos, entonces podría hacer algo como esto, pero incluso entonces errar por el lado de una vista a menos que simplemente no pueda obtener el rendimiento que necesita con índices, hardware decente, etc.

Aquí hay una consulta que devolverá las filas de la forma que las necesite.

SELECT Account, Bookdate, Amount, ( SELECT SUM(Amount) FROM My_Table T2 WHERE T2.Account = T1.Account AND T2.Bookdate <= T1.Bookdate ) AS Running_Total FROM My_Table T1

Otra posible solución es:

SELECT T1.Account, T1.Bookdate, T1.Amount, SUM(T2.Amount) FROM My_Table T1 LEFT OUTER JOIN My_Table T2 ON T2.Account = T1.Account AND T2.Bookdate <= T1.Bookdate GROUP BY T1.Account, T1.Bookdate, T1.Amount

Pruébeles a los dos por rendimiento y vea cuál funciona mejor para usted. Además, no los he probado exhaustivamente más allá del ejemplo que usted me dio, así que asegúrese de probar algunos casos extremos.


Usa análisis, como en tu última pregunta:

create table accounts ( account number(10) , bookdate date , amount number(10) ); delete accounts; insert into accounts values (1,to_date(''20080101'',''yyyymmdd''),100); insert into accounts values (1,to_date(''20080102'',''yyyymmdd''),101); insert into accounts values (2,to_date(''20080102'',''yyyymmdd''),200); insert into accounts values (1,to_date(''20080103'',''yyyymmdd''),-200); commit; select account , bookdate , amount , sum(amount) over (partition by account order by bookdate asc) running_total from accounts order by account,bookdate asc /

salida:

ACCOUNT BOOKDATE AMOUNT RUNNING_TOTAL ---------- -------- ---------- ------------- 1 01-01-08 100 100 1 02-01-08 101 201 1 03-01-08 -200 1 2 02-01-08 200 200