Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-09-2007
Avatar de Alejandrina
Alejandrina Alejandrina is offline
Miembro
 
Registrado: mar 2007
Ubicación: Medellin
Posts: 46
Poder: 0
Alejandrina Va por buen camino
Question 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
Que estoy haciendo mal, como debo realizar esta consulta?

Agradezco a quien me pueda dar luces...Gracias!
__________________
Alejandrina
Responder Con Cita
  #2  
Antiguo 25-09-2007
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 25-09-2007
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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*/
Responder Con Cita
  #4  
Antiguo 25-09-2007
Avatar de Alejandrina
Alejandrina Alejandrina is offline
Miembro
 
Registrado: mar 2007
Ubicación: Medellin
Posts: 46
Poder: 0
Alejandrina Va por buen camino
Question 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...

Help!!!
__________________
Alejandrina
Responder Con Cita
  #5  
Antiguo 25-09-2007
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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.
Responder Con Cita
  #6  
Antiguo 26-09-2007
Avatar de Alejandrina
Alejandrina Alejandrina is offline
Miembro
 
Registrado: mar 2007
Ubicación: Medellin
Posts: 46
Poder: 0
Alejandrina Va por buen camino
Question 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.

Espero haberme hecho entender y que me puedan colaborar...Muchas gracias
__________________
Alejandrina
Responder Con Cita
  #7  
Antiguo 26-09-2007
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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?

Última edición por duilioisola fecha: 26-09-2007 a las 16:09:13.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
error, el índice o la clave principal no puede tener un valor null locorez Varios 3 15-12-2006 04:40:42
Cuantos <Script></Script> deben haber en un <Body>? Deiv HTML, Javascript y otros 9 07-12-2006 01:27:50
Error en OnCalcFields con valor retornado de un SELECT SUM() Cabanyaler Conexión con bases de datos 1 17-10-2006 11:44:22
Error pasando un valor a unDbgrid jandres Varios 1 17-06-2006 01:26:25
Error: El valor EOF o BOF es True o el actuañ registro de eliminó lavtaro Conexión con bases de datos 2 30-06-2003 11:39:44


La franja horaria es GMT +2. Ahora son las 13:14:10.


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
Copyright 1996-2007 Club Delphi