Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   SQL Script Error (mas de un valor) (https://www.clubdelphi.com/foros/showthread.php?t=48438)

Alejandrina 25-09-2007 15:04:37

SQL Script Error (mas de un valor)
 
Hola a todos, estoy realizando una consulta con el fin de actualizar un campo en una tabla con el resultado de una subconsulta pero me arroja el siguiente error:
'La subconsulta ha devuelto mas de un valor lo que no es correcto cuando va a continuacion de =,!,<,<=,>,>= o cuando se utiliza como expresión'

La consulta que ejecuto es la siguiente:
Código:

update resultadoevalu
set resultadocalifresp=(
select sum(cc.calificacion) /max(codigoresponsabilidad) as totalcaliresp
from personal p
inner join  calificacionresponsabilidadjefe  cc on cc.cedula=p.cedula
group by cc.fechaevaluacion,p.cedula)
where resultadocalifresp=0 and resultadocalifhab=0 and totalevalu=0

:confused:Que estoy haciendo mal, como debo realizar esta consulta?:confused:

Agradezco a quien me pueda dar luces...Gracias!

marcoszorrilla 25-09-2007 15:10:16

Como realices operaciones dentro de la consulta, es posible que al devolverte un valor con decimales el campo de recepción se por ejemplo entero y de ahí puede venir el error.

Código SQL [-]
update resultadoevalu set resultadocalifresp=( select sum(cc.calificacion) /max(codigoresponsabilidad)
 as totalcaliresp from personal
 p inner join calificacionresponsabilidadjefe cc on cc.cedula=p.cedula
 group by cc.fechaevaluacion,p.cedula) where resultadocalifresp=0 and resultadocalifhab=0 and totalevalu=0

Suponiendo que ese fuera el error, tendrías que utilizar CAST.

Un Saludo.

duilioisola 25-09-2007 15:41:28

El error te está diciendo que el select que haces para hacer el update da mas de un valor.

Código SQL [-]
update resultadoevalu
set resultadocalifresp=(
select sum(cc.calificacion) /max(codigoresponsabilidad) as totalcaliresp
from personal p 
inner join  calificacionresponsabilidadjefe  cc on cc.cedula=p.cedula 
group by cc.fechaevaluacion,p.cedula)
where resultadocalifresp=0 and resultadocalifhab=0 and totalevalu=0

Si ese select devuelve más de un valor, ¿cuál será el que tiene que utilizar para meter en resultadocalifresp?

Realiza el select interno y verás que te devuelve dos valores

Código SQL [-]
select sum(cc.calificacion) /max(codigoresponsabilidad) as totalcaliresp
from personal p 
inner join  calificacionresponsabilidadjefe  cc on cc.cedula=p.cedula 
group by cc.fechaevaluacion,p.cedula)

/*seguramente devuelve dos o más valores*/

Alejandrina 25-09-2007 16:11:26

SQL Script Error (mas de un valor)
 
Hola, gracias por ayudarme.
Efectivamente lo que me dicen es cierto el resultado de la subconsulta arroja valores tipo 95.8333 aplicando el CAST solo a la subconsulta esta ya me arroja valores tipo 95 pero cuando lo ejecuto todo completo me sale el mismo error...

Código:

update resultadoevalu
set resultadocalifresp=(select cast(sum(cc.calificacion) /max(codigoresponsabilidad)as int) as totalcaliresp
from personal p
inner join  calificacionresponsabilidadjefe  cc on cc.cedula=p.cedula
group by cc.fechaevaluacion,p.cedula)
where resultadocalifresp=0 and resultadocalifhab=0 and totalevalu=0

Sip la consulta me devuelve mas de dos valores entonces como tendria que hacerle...la idea es actualizar uno a uno los datos de la tabla resultadoevalu con los datos que resultaron de la subconsulata...

:confused:Help!!!:confused:

duilioisola 25-09-2007 17:25:26

Por lo que entiendo quieres poner - en todos los registros que cumplan resultadocalifresp=0 and resultadocalifhab=0 and totalevalu=0 - en el campo resultadocalifresp de la tabla resultadoevalu un único valor que sacas de una subconsulta.

Con este update pones un único valor a cada regisro. Sería como hacer lo siguiente:
Código SQL [-]
var_temporal = select sum(cc.calificacion) /max(codigoresponsabilidad) as totalcaliresp
from personal p 
inner join  calificacionresponsabilidadjefe  cc on cc.cedula=p.cedula 
group by cc.fechaevaluacion,p.cedula

update resultadoevalu
set resultadocalifresp=var_temporal
where resultadocalifresp=0 and resultadocalifhab=0 and totalevalu=0

Si la subconsulta te arroja mas de un valor, debes elegir cual vas a usar para hacer el update.
Tienes varias opciones min, max, avg, fist ...
Código SQL [-]
update resultadoevalu
set resultadocalifresp=(
select min sum(cc.calificacion) /max(codigoresponsabilidad) as totalcaliresp
from personal p 
inner join  calificacionresponsabilidadjefe  cc on cc.cedula=p.cedula 
group by cc.fechaevaluacion,p.cedula)
where resultadocalifresp=0 and resultadocalifhab=0 and totalevalu=0

Si no es eso lo que quieres, explícanos la situación un poco más detalladamente.

Alejandrina 26-09-2007 15:46:17

SQL Script Error (mas de un valor)
 
Hola, Explicare mi situación mas detalladamente. La subconculta me arroja los siguientes resultados por decir algo 95,100,100,62,100,93,62,25,75...
Ahora en ese mismo orden quiero actualizar el campo ResultadoCalifResp donde se cumpla que los campos resultadocalifresp=0 and resultadocalifhab=0 and totalevalu=0...mmm es algo como esto:

Cedula resultadoCaliCargo resultadocalifresp resultadocalifhab totalevalu
a 65 95 75 78
b 75 95 0 0
c 40 63 75 59
d 75 100 0 0
e 80 100 0 0

Estoy ejecutando esta consulta desde el Database Explorer.

:rolleyes:Espero haberme hecho entender y que me puedan colaborar...Muchas gracias

duilioisola 26-09-2007 16:02:48

En este caso, lo único que se me ocurre es hacer un procedimiento...
Código:

95,100,100,62,100,93,62,25,75...

a  65  95  75  78
b  75  0    0  0
c  40  63  75  59
d  75  0    0  0
e  80  0    0  0

pasa a -->

a  65  95  75  78
b  75  95  0  0
c  40  63  75  59
d  75 100  0  0
e  80 100  0  0

Código SQL [-]
procedure rellenar_resultadoevalu
as
declare variable cedula varchar(1); /*aqui debes poner lo que corresponda*/
declare variable temporal double precision; /*supongo que no es entero porque sale de una division*/
begin
   /*Recorro todos los resultados de la subconsulta y los meto en temporal*/
   for select select sum(cc.calificacion) / max(codigoresponsabilidad) as totalcaliresp
       from personal p 
       inner join  calificacionresponsabilidadjefe cc 
       on cc.cedula=p.cedula 
       group by cc.fechaevaluacion,p.cedula
   into :temporal do
   begin
      /*inicializo cedula como vacio*/
      cedula = '';
      /*selecciono lo primera cedula a actualizar*/
      /*tener en cuenta el orden*/
      select first cedula from resultadoevalu
      where resultadocalifresp=0 and resultadocalifhab=0 and totalevalu=0
      order by cedula
      into :cedula;
      /*Si encuentro una cedula que cumpla la condicion hago el update*/
      if (cedula <> '') then
         update resultadoevalu
         set resultadocalifresp=temporal
         where cedula=:cedula;
   end
end
y luego
Código SQL [-]
execute procedure rellenar_resultadoevalu;

Nota: Qué pasa con los valores que sobran en la subconsulta si no se encuentran suficientes registros que cumplan la condición en resultadoevalu?
95,100,100,62,100,93,62,25,75,...

Nota 2: En qué orden deben entrar los valores de la subconsulta en la tabla resultadoevalu?


La franja horaria es GMT +2. Ahora son las 05:10:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi