Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Duda con Query

Estas en el tema de Duda con Query en el foro de Oracle en Foros del Web. Tengo una tabla de la cual debo sumar los saldo mes a mes Por ejemplo debo sacar en otra columna los saldos de cada uno ...
  #1 (permalink)  
Antiguo 31/03/2013, 08:22
Avatar de YeisonSoto  
Fecha de Ingreso: enero-2011
Ubicación: Cali, Colombia, Colombia
Mensajes: 116
Antigüedad: 13 años, 2 meses
Puntos: 4
Duda con Query

Tengo una tabla de la cual debo sumar los saldo mes a mes



Por ejemplo debo sacar en otra columna los saldos de cada uno de los meses

Saldo_Enero
= SALDO_INICIAL + ENERO
Saldo_Febrero = Saldo_Enero + FEBRERO
Saldo_Marzo = Saldo_Febrero + MARZO

Como hago para sacar estos saldos?

Tengo que para Saldo_Enero:

Código:
SELECT SALDO_INICIAL + ENERO AS "Saldo Enero"
FROM MESES




He intentado hacer:

Código:
SELECT SALDO_INICIAL + ENERO AS "Saldo Enero",
Saldo_Enero + FEBRERO AS "Saldo_Febrero",
Saldo_Febrero + MARZO AS "Saldo_marzo"
...
FROM MESES

Pero no funciona para los otros saldo

Agradezco la ayuda que me puedan dar....
  #2 (permalink)  
Antiguo 31/03/2013, 08:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Duda con Query

Cita:
Pero no funciona para los otros saldo
Por regla general de todos los DBMS (Oracle incluido), no puedes usar un alias como origen de datos dentro del mismo SELECT donde se crea, como tampoco lo puedes usar en el WHERE.
Tienes que usar funciones de agrupamiento.

Dale una leida a este link para aclarar mas o menos por donde tienes que ir:
http://www.oracle-base.com/articles/...uping-sets.php

Lo que si puedo decirte es que ese diseño de tablas es totalmente inadecuado para realizar se tipo de consultas. Muestra un diseño de base de datos muy ineficiente...
Si tienes N saldos, que se relacionan con N productos, los saldos pasan a ser una tabla relacional, y cada entrada de esa tabla corresponde a un mes determinado, para un producto determinado. Pero no se crea una tabla con doce campos.... Eso no está bien.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 31/03/2013, 13:55
Avatar de YeisonSoto  
Fecha de Ingreso: enero-2011
Ubicación: Cali, Colombia, Colombia
Mensajes: 116
Antigüedad: 13 años, 2 meses
Puntos: 4
Pregunta Respuesta: Duda con Query

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Por regla general de todos los DBMS (Oracle incluido), no puedes usar un alias como origen de datos dentro del mismo SELECT donde se crea, como tampoco lo puedes usar en el WHERE.
Tienes que usar funciones de agrupamiento.

Dale una leida a este link para aclarar mas o menos por donde tienes que ir:
http://www.oracle-base.com/articles/...uping-sets.php

Lo que si puedo decirte es que ese diseño de tablas es totalmente inadecuado para realizar se tipo de consultas. Muestra un diseño de base de datos muy ineficiente...
Si tienes N saldos, que se relacionan con N productos, los saldos pasan a ser una tabla relacional, y cada entrada de esa tabla corresponde a un mes determinado, para un producto determinado. Pero no se crea una tabla con doce campos.... Eso no está bien.

Gracias por responder gnzsoloyo, ya he hecho los ejemplos y aun no comprendo como puedo aplicarlo a lo que necesito

Me puedes echar una mano?
  #4 (permalink)  
Antiguo 31/03/2013, 14:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Duda con Query

Sólo si posteas tus intentos...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 02/04/2013, 05:15
Avatar de YeisonSoto  
Fecha de Ingreso: enero-2011
Ubicación: Cali, Colombia, Colombia
Mensajes: 116
Antigüedad: 13 años, 2 meses
Puntos: 4
Respuesta: Duda con Query

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Sólo si posteas tus intentos...
Hola gnzsoloyo sigo sin entender como puedo aplicarlo a mi problema

Hasta ahora tengo que: (funciona)

Código:
SELECT saldo_inicial + enero "Saldo Enero", 
             saldo_inicial + enero + febrero "Saldo Febrero" 
             saldo_inicial + enero + febrero+Marzo "Saldo Marzo" 
             saldo_inicial + enero+ ........
FROM tabla;
Pero como son 13 meses con el mes de cuadre se me haria un query demaciado largo y eso es lo que no quiero

Me puedes explicar como debo usar las funciones de agrupamiento en este caso?.
  #6 (permalink)  
Antiguo 02/04/2013, 11:18
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 16 años, 10 meses
Puntos: 43
Respuesta: Duda con Query

Es un poco enrevesado lo que pretendes.

Tal vez podrías usar campos calculados ( rellenados por un trigger ) que al rellenar por ejemplo el campo ENERO, en un campo calculado llamado p.e. SALDO_ENERO te lo rellene con la suma del SALDO_INICAL y el de ENERO para un concepto dado..................
  #7 (permalink)  
Antiguo 03/04/2013, 09:23
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Duda con Query

Este PL te recibe como parametro el mes y el concepto que tengas.

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION suma_agregada(concepto_id VARCHAR2,mes_columna NUMBER) RETURN NUMBER IS
  2. TYPE rec IS record(
  3. saldo_inicial NUMBER,
  4. enero NUMBER,
  5. febrero NUMBER,
  6. marzo NUMBER,
  7. abril NUMBER,
  8. mayo NUMBER,
  9. junio NUMBER,
  10. julio NUMBER,
  11. agosto NUMBER,
  12. septiembre NUMBER,
  13. octubre NUMBER,
  14. noviembre NUMBER,
  15. diciembre NUMBER
  16. );
  17. TYPE tabla IS TABLE OF NUMBER INDEX BY BINARY_INTEGER ;
  18. rec_var rec;
  19. suma_agrupada NUMBER := 0;
  20. v_saldo_inicial NUMBER;
  21. valores tabla;
  22. BEGIN
  23. SELECT saldo_inicial,enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre
  24. INTO rec_var
  25. FROM meses WHERE concepto = concepto_id;
  26.  
  27. v_saldo_inicial := rec_var.saldo_inicial;
  28. valores(1) := rec_var.enero;
  29. valores(2) := rec_var.febrero;
  30. valores(3) := rec_var.marzo;
  31. valores(4) := rec_var.abril;
  32. valores(5) := rec_var.mayo;
  33. valores(6) := rec_var.junio;
  34. valores(7) := rec_var.julio;
  35. valores(8) := rec_var.agosto;
  36. valores(9) := rec_var.septiembre;
  37. valores(10) := rec_var.octubre;
  38. valores(11) := rec_var.noviembre;
  39. valores(12) := rec_var.diciembre;
  40.  
  41. suma_agrupada := v_saldo_inicial;
  42. FOR i IN REVERSE 1..mes_columna  loop
  43. suma_agrupada := suma_agrupada + valores(i);
  44. END LOOP;
  45. RETURN suma_agrupada;
  46. END;
  47. /

Para usarlo sería así:
Código SQL:
Ver original
  1. SELECT
  2. concepto,
  3. suma_agregada(concepto,1) enero,
  4. suma_agregada(concepto,2) febrero,
  5. suma_agregada(concepto,3) marzo
  6. FROM meses;

Los meses que quieras.

Saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 08/04/2013, 21:12
Avatar de YeisonSoto  
Fecha de Ingreso: enero-2011
Ubicación: Cali, Colombia, Colombia
Mensajes: 116
Antigüedad: 13 años, 2 meses
Puntos: 4
De acuerdo Respuesta: Duda con Query

Cita:
Iniciado por huesos52 Ver Mensaje

Los meses que quieras.

Saludos
Huesos el plsql funcionó perfectamente...

Pero ahora que decidí mejorar el modelo de datos y siguiendo el consejo de gnzsoloyo " Muestra un diseño de base de datos muy ineficiente...
Si tienes N saldos, que se relacionan con N productos, los saldos pasan a ser una tabla relacional, y cada entrada de esa tabla corresponde a un mes determinado, para un producto determinado. Pero no se crea una tabla con doce campos.... Eso no está bien.
", quedando como resultado 3 tablas en vez de una, me esta generando errores para generar los saldos de los meses con el pl...

Me puedes ayudar a hacerlo para tres tablas?

Esta es la consulta que uso, sin los saldos calculados:


Código SQL:
Ver original
  1. SELECT
  2.         SUM("F0902"."GBAPYC"/100) AS "Inicial",
  3.         SUM("F0902"."GBAN01"/100) AS "Enero",
  4.         SUM("F0902"."GBAN02"/100) AS "Febrero",
  5.         SUM("F0902"."GBAN03"/100) AS "Marzo",
  6.         /*SaldoEnero*/
  7.         /*SaldoFebrero*/
  8.         "F0006"."MCMCU"  AS "MCMCU",
  9.         "F0006"."MCDL01" AS "MCDL01",
  10.         "F0901"."GMOBJ"  AS "GMOBJ",
  11.         "F0901"."GMSUB"  AS "GMSUB",
  12.         "F0901"."GMDL01" AS "GMDL01"
  13.  FROM   "F0006" "F0006",
  14.         "F0901" "F0901",
  15.         "F0902" "F0902"
  16.  WHERE  "F0902"."GBAID"="F0901"."GMAID"
  17.  AND    "F0902"."GBMCU"="F0006"."MCMCU"
  18.  AND   TRIM ("F0902"."GBOBJ") LIKE '14%'
  19.  AND    "F0902"."GBFY" =13
  20.  AND    "F0902"."GBCO" ='00001'
  21.  AND    "F0902"."GBLT" ='AA'
  22.  AND    TRIM("F0902"."GBOBJ")!='149999'
  23.  AND    TRIM("F0006"."MCRP22")=:Establecimiento
  24.  
  25. GROUP BY "F0901"."GMDL01",
  26.          "F0006"."MCMCU",
  27.          "F0006"."MCDL01",
  28.          "F0901"."GMOBJ",
  29.          "F0901"."GMSUB"

He aqui la funcion que tu me pusiste, no me genera error, el concepto lo llamo desde otra tabla, la "F0901"."GMDL01"


Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION suma_agregada(concepto_id VARCHAR2,mes_columna NUMBER) RETURN NUMBER IS
  2.     TYPE rec IS record(
  3.     GBAPYC NUMBER,
  4.     GBAN01 NUMBER,
  5.     GBAN02 NUMBER,
  6.     GBAN03 NUMBER,
  7.     GBAN04 NUMBER
  8.     );
  9.  
  10.     TYPE tabla IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
  11.     rec_var rec;
  12.     suma_agrupada NUMBER :=0;
  13.     v_saldo_inicial NUMBER;
  14.     valores tabla;
  15.     BEGIN
  16.     SELECT GBAPYC,GBAN01,GBAN02,GBAN03,GBAN04
  17.     INTO rec_var
  18.     FROM F0901, F0902 WHERE GMDL01 = concepto_id;
  19.      
  20.     v_saldo_inicial := rec_var.GBAPYC;
  21.     valores(1) := rec_var.GBAN01;
  22.     valores(2) := rec_var.GBAN02;
  23.     valores(3) := rec_var.GBAN03;
  24.     valores(4) := rec_var.GBAN04;
  25.  
  26.     suma_agrupada := v_saldo_inicial;
  27.     FOR i IN REVERSE 1..mes_columna  loop
  28.     suma_agrupada := suma_agrupada + valores(i);
  29.     END LOOP;
  30.     RETURN suma_agrupada;
  31. END;
  32. /

Pero al llamar la funcion


Código SQL:
Ver original
  1. SELECT
  2.     F0901.GMDL01, --Concepto
  3.     suma_agregada(GMDL01,1) GBAN01, --Enero
  4.     suma_agregada(GMDL01,2) GBAN02, --Febrero
  5.     suma_agregada(GMDL01,3) GBAN03,  --Marzo
  6.     suma_agregada(GMDL01,4) GBAN04
  7. FROM F0901,F0902

me genera este error:


Código SQL:
Ver original
  1. Error SQL: ORA-01422: la recuperación exacta devuelve un número mayor de filas que el solicitado
  2. ORA-06512: en "SYSTEM.SUMA_AGREGADA", línea 16
  3. 01422.00000 -  "exact fetch returns more than requested number of rows"
  4. *Cause:    The NUMBER specified IN exact fetch IS less than the ROWS returned.
  5. *Action:   Rewrite the query OR CHANGE NUMBER OF ROWS requested


Agradeceria si me pudieras ayudar....

Etiquetas: sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:22.