Ver Mensaje Individual
  #8 (permalink)  
Antiguo 08/04/2013, 21:12
Avatar de YeisonSoto
YeisonSoto
 
Fecha de Ingreso: enero-2011
Ubicación: Cali, Colombia, Colombia
Mensajes: 116
Antigüedad: 13 años, 9 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....