PDA

Ver la Versión Completa : Error en Subconsulta sencillo


ingabraham
17-12-2008, 15:17:47
interbase 6.0
Espero la ayuda de los que dominan el sql.

El errror es el sgte:
multiple row in singleton select



Select n.codigo, n.nombre, Sum(Select n.VALORDV From nomina n where n.Cedulae=e.cedula and n.codigoc='010' )as Sueldo
From empleado t, empleos e, cargos c, niveles n
Where t.cedula=e.cedula And e.cod_cargo=c.codigo And c.CODIGONIVEL=n.codigo

GROUP BY n.codigo,n.nombre



Explicación:
tengo las sgtes tablas:

empleados,empleos = empleados clasificados por niveles

cargo,niveles =directivo,asesor...

nomina =estan los historiales de todas las nominas desde enero2008 a dic2008.

Resultado esperado

nivel sueldo
------------------
directivo 4522526
asesor 452466
profesional 552466

cuando filtro en un solo mes si me funciona pero al momento de escojer todos los meses de la nomina , me arroja el error, q a mi parecer es la seleccion de multiples registros.
como puedo hacer de otra manera esto.

poliburro
17-12-2008, 16:29:50
Select Niveles.Codigo, Niveles.Nombre, Sueldo.Monto
From Empleado As Empleado
Inner Join Empleos As Empleos
On Empleado = Empleado.Cedula = Empleos.Cedula
Inner Join Cargos As Cargos
On Empleos.Cod_Cargo = Cargos.Codigo
Inner Join Niveles As Niveles
On Cargos.CodigoNivel = Niveles.Codigo
Left Join (
Select Cedula, Sum(VALORDV ) As Monto
From nomina
where codigoc = '010'
Group By Cedula
) Sueldo
On Empleado.Cedula = Sueldo.Cedula

ingabraham
17-12-2008, 18:05:43
Select Niveles.Codigo, Niveles.Nombre, Sueldo.Monto
From Empleado Empleado
Inner Join Empleos Empleos
On Empleado.Cedula = Empleos.Cedula
Inner Join Cargos Cargos
On Empleos.Cod_Cargo = Cargos.Codigo
Inner Join Niveles Niveles
On Cargos.CodigoNivel = Niveles.Codigo
Left Join (
select Cedulae, Sum((CAST(VALORDV AS NUMERIC))) As Monto
From nomina
where codigoc = '010'
Group By Cedulae
) As Sueldo
On Empleado.Cedula = Sueldo.Cedulae


Inserte mi codigo sql asi:
me aparece error
invalid token
Select.

En esta linea
select Cedulae, Sum((CAST(VALORDV AS NUMERIC))) As Monto

poliburro
17-12-2008, 21:02:39
Prueba quitando el As. No conozco casi nada del sql de interbase por lo que tendremos que esperar que los compañeros expertos en ese motor nos echen una mano.

Saludos

ingabraham
18-12-2008, 15:24:11
en realidad esta linea de union no la tengo muy clara



Left Join (
select Cedulae, Sum((CAST(VALORDV AS NUMERIC))) As Monto
From nomina where codigoc = '010'
Group By Cedulae
) As Sueldo
On Empleado.Cedula = Sueldo.Cedulae


creo q intentas armar una tabla logica(ced,monto) llamada sueldo y comparar los registros con cada cedula

poliburro
18-12-2008, 20:39:15
Efectivamente, meter un select a nivel de fila es tremendamente ineficiente. Conviene más obtener la suma de montos por cada cédula y esta subcosulta unirla con los empleados por su cédula.

Saludos

PepeLolo
20-12-2008, 02:42:12
La consulta seria esto

Select n.codigo, n.nombre, Sum(nm.VALORDV) Sueldo
From empleado t,
join empleos e on t.cedula=e.cedula
join cargos c on e.cod_cargo=c.codigo
join niveles n on c.CODIGONIVEL=n.codigo
join nomina nm on nm.Cedulae=e.cedula and nm.codigoc='010'
GROUP BY n.codigo,n.nombre


Suerte:D