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