none
Error al sumar columnas renombradas RRS feed

  • Pregunta

  • Hola, alguien puede ayudarme con este error?

    Intento sumas las columnas (calRSFS, calCSFS, calRP, calCP, calSRL) dentro de (MontoTotal) pero me dice que las columnas son invalidas.

    ALTER PROCEDURE [dbo].[Nom_GeneracionNomina]
      @Empresa int,
      @TipoNomina int,
      @PeriodoNomina int,
      @Fecha date
    AS
    BEGIN

    DECLARE @_RSFS as DECIMAL(11,4);
    DECLARE @_CSFS as DECIMAL(11,4);
    DECLARE @_RP as DECIMAL(11,4);
    DECLARE @_CP as DECIMAL(11,4);
    DECLARE @_SRL as DECIMAL(11,4);

    SET @_RSFS = 0.0304;
    SET @_CSFS = 0.0709;
    SET @_RP = 0.0287;
    SET @_CP = 0.071;
    SET @_SRL = 0.011;
     
    SELECT
    emp.id_empleado,
    emp.cedula,
    emp.nombre + ' ' + ISNULL(emp.apellido,'') as Nombre,
    sn.sueldo_mensual as SueldoMensual,
    cast((sn.sueldo_mensual * @_RSFS) as DECIMAL(11,2)) as calRSFS,
    cast((sn.sueldo_mensual * @_CSFS) as DECIMAL(11,2)) as calCSFS,
    cast((sn.sueldo_mensual * @_RP) as DECIMAL(11,2)) as calRP,
    cast((sn.sueldo_mensual * @_CP) as DECIMAL(11,2)) as calCP,
    cast((sn.sueldo_mensual * @_SRL) as DECIMAL(11,2)) as calSRL,
    MontoTotal = ROUND((calRSFS + calCSFS + calRP + calCP, + calSRL), 2),
    a.CuotaPrestamo as MontoCuotaPrestamo

    FROM nom_empleados emp
    LEFT JOIN nom_empleados_sueldo_nomina sn ON emp.id_empleado = sn.id_empleado
    LEFT JOIN (
            SELECT cuotas As CuotaPrestamo, id_prestamo as IdPrestamo, id_empleado
            FROM nom_prestamos prtms
            WHERE cuotas > 0
        ) AS a
    ON emp.id_empleado = a.id_empleado
    ORDER BY emp.nombre DESC

    END


    Gracias de antemano

    domingo, 21 de febrero de 2016 17:21

Respuestas

  • Hola Adalberto Rosario,

    No puedes hacer referencia dentro de la lista de selección al nombre de una columna que es producto de una expresión, te dejo una posible solución con algunas indicaciones:

    1. Puedes ahorrar unas cuántas líneas de código y mejorar la legibilidad sí en la misma línea declaras e inicializas un valor a la variable.
    2. No necesitas hacer una subconsulta para combinar filas con la tabla [nom_prestamos], puedes combinar directamente sus filas con el conjunto de la derecha.
    3. Finalmente, como no puedes referenciar al nombre de las columnas que son producto de una expresión, debes de recrear la expresión.

    ALTER PROCEDURE [dbo].[Nom_GeneracionNomina]
    	@Empresa int,
    	@TipoNomina int,
    	@PeriodoNomina int,
    	@Fecha date
    AS
    BEGIN
    
    	DECLARE @_RSFS AS decimal(11,4) = 0.0304;
    	DECLARE @_CSFS AS decimal(11,4) = 0.0709;
    	DECLARE @_RP AS decimal(11,4) = 0.0287;
    	DECLARE @_CP AS decimal(11,4) = 0.071;
    	DECLARE @_SRL AS decimal(11,4) = 0.011;
    	 
    	SELECT
    		emp.id_empleado,
    		emp.cedula,
    		emp.nombre + ' ' + ISNULL(emp.apellido, '') AS Nombre,
    		sn.sueldo_mensual AS SueldoMensual,
    		CAST((sn.sueldo_mensual * @_RSFS) AS decimal(11,2)) AS calRSFS,
    		CAST((sn.sueldo_mensual * @_CSFS) AS decimal(11,2)) AS calCSFS,
    		CAST((sn.sueldo_mensual * @_RP) AS decimal(11,2)) AS calRP,
    		CAST((sn.sueldo_mensual * @_CP) AS decimal(11,2)) AS calCP,
    		CAST((sn.sueldo_mensual * @_SRL) AS decimal(11,2)) AS calSRL,
    		ROUND(((@_RSFS + @_CSFS + @_RP + @_CP + @_SRL) * sn.sueldo_mensual), 2) AS MontoTotal,
    		prtms.cuotas AS MontoCuotaPrestamo
    	FROM 
    		nom_empleados emp
    		LEFT JOIN nom_empleados_sueldo_nomina sn ON (emp.id_empleado = sn.id_empleado)
    		LEFT JOIN nom_prestamos prtms ON (emp.id_empleado = prtms.id_empleado)
    			AND (prtms.cuotas > 0)
    	ORDER BY 
    		emp.nombre DESC
    END

    Otra solución es crear un conjunto temporal (una CTE) donde primero contengas el calculo de las expresiones para luego re-utilizarlas como una columna cualquiera, pero para tu caso basta con recrear la expresión por no ser extensa.


    domingo, 21 de febrero de 2016 18:37

Todas las respuestas

  • Hola Adalberto Rosario,

    No puedes hacer referencia dentro de la lista de selección al nombre de una columna que es producto de una expresión, te dejo una posible solución con algunas indicaciones:

    1. Puedes ahorrar unas cuántas líneas de código y mejorar la legibilidad sí en la misma línea declaras e inicializas un valor a la variable.
    2. No necesitas hacer una subconsulta para combinar filas con la tabla [nom_prestamos], puedes combinar directamente sus filas con el conjunto de la derecha.
    3. Finalmente, como no puedes referenciar al nombre de las columnas que son producto de una expresión, debes de recrear la expresión.

    ALTER PROCEDURE [dbo].[Nom_GeneracionNomina]
    	@Empresa int,
    	@TipoNomina int,
    	@PeriodoNomina int,
    	@Fecha date
    AS
    BEGIN
    
    	DECLARE @_RSFS AS decimal(11,4) = 0.0304;
    	DECLARE @_CSFS AS decimal(11,4) = 0.0709;
    	DECLARE @_RP AS decimal(11,4) = 0.0287;
    	DECLARE @_CP AS decimal(11,4) = 0.071;
    	DECLARE @_SRL AS decimal(11,4) = 0.011;
    	 
    	SELECT
    		emp.id_empleado,
    		emp.cedula,
    		emp.nombre + ' ' + ISNULL(emp.apellido, '') AS Nombre,
    		sn.sueldo_mensual AS SueldoMensual,
    		CAST((sn.sueldo_mensual * @_RSFS) AS decimal(11,2)) AS calRSFS,
    		CAST((sn.sueldo_mensual * @_CSFS) AS decimal(11,2)) AS calCSFS,
    		CAST((sn.sueldo_mensual * @_RP) AS decimal(11,2)) AS calRP,
    		CAST((sn.sueldo_mensual * @_CP) AS decimal(11,2)) AS calCP,
    		CAST((sn.sueldo_mensual * @_SRL) AS decimal(11,2)) AS calSRL,
    		ROUND(((@_RSFS + @_CSFS + @_RP + @_CP + @_SRL) * sn.sueldo_mensual), 2) AS MontoTotal,
    		prtms.cuotas AS MontoCuotaPrestamo
    	FROM 
    		nom_empleados emp
    		LEFT JOIN nom_empleados_sueldo_nomina sn ON (emp.id_empleado = sn.id_empleado)
    		LEFT JOIN nom_prestamos prtms ON (emp.id_empleado = prtms.id_empleado)
    			AND (prtms.cuotas > 0)
    	ORDER BY 
    		emp.nombre DESC
    END

    Otra solución es crear un conjunto temporal (una CTE) donde primero contengas el calculo de las expresiones para luego re-utilizarlas como una columna cualquiera, pero para tu caso basta con recrear la expresión por no ser extensa.


    domingo, 21 de febrero de 2016 18:37
  • Muchas gracias Willams

    Ahora entiendo donde estaba el problema

    domingo, 21 de febrero de 2016 19:06