none
Sumar dos consultas RRS feed

  • Pregunta

  • Buenas a todos

    por favor necesito una ayudita: necesito crear un procedure que me sume dos consultas esta es: 

    CREATE proc [dbo].[DeudaTotalAlumno]
    @dni char(8)

    as
     Select (select sum(Importe) from
    Pensiones p  where Estado = '1' and p.Dni_alu=@dni)   + (Select sum(Saldo) from
    Pago i  where i.Dni_alu=@dni )as 'Total'

    les explico, la primera consulta me suma todas las pensiones pendientes de pago de LA TABLA PENSIONES  y la segunda todos los saldos pendientes de pago por otros conceptos DE LA TABLA PAGOS, me funciona cuando en la primera consulta encuentra QUE SUMAR  pero si no hay pensiones pendientes de pago PERO SI hay saldos pendientes me bota 0 o null, OSEA SOLO SUMA SI EN LA PRIMERA CONSULTA HAY ALGO QUE SUMAR. por favor agradeceria mucho me puedan ayudar. aqui les envio las tablas que solo tienes estos datos. por ejm si ejecuto el procedure con el dni 14141414 sale resultado 1380 ..pero si ejecuto por ejm con 10661353 me sale 0/null...




    lunes, 13 de mayo de 2013 4:16

Respuestas

  • Prueba así, si no estoy equivocado tenías un parentesís demás 

    create proc [dbo].[DeudaTotalAlumno]
    @dni char(8)
     
     AS
    ;WITH CTE
    AS
    (
    	SELECT 
    	Importe AS Valor
    	FROM 
    	Pensiones p  
    	WHERE
    	Estado = '1' and p.Dni_alu=@dni  
    
    	UNION ALL
    
    	SELECT 
    	Saldo AS Valor
    	FROM
    	Pago i  
    	WHERE i.Dni_alu=@dni 
    )
    SELECT SUM(Valor)
    FROM CTE

    Y si ya tienes create tu procedimiento, cambia el CREATE por ALTER.


    Sergio Sánchez Arias
    AYÚDANOS A AYUDARTE

    • Marcado como respuesta Aldo Salazar lunes, 13 de mayo de 2013 17:47
    lunes, 13 de mayo de 2013 17:39
  • Como bien comente antes no necesitas el punto y coma si la declaracion de la CTE no es precedida por otra sentencia.

    Una sugerencia extra seria que use los caracteres "[" y "]" para los casos de nombres de identificadores que contengan caracteres no validos. En vez de 'Deuda Total' deberias usar [Deuda Total]. Otra sugesrencia seria que uses SET NOCOUNT OFF al comienzo de tus procedimientos si deseas evitar que el mensaje sobre filas afectadoas sea procesado en la aplicacion cliente como un resultado mas de tu ejecucion.


    AMB

    Some guidelines for posting questions...


    • Editado HunchbackMVP lunes, 13 de mayo de 2013 18:03
    • Marcado como respuesta Aldo Salazar lunes, 13 de mayo de 2013 18:45
    lunes, 13 de mayo de 2013 18:01

Todas las respuestas

  • WITH CTE
    AS
    (
    	SELECT 
    		Importe AS Valor
    	FROM 
    		Pensiones p  
    	WHERE
    		Estado = '1' and p.Dni_alu=@dni)   
    
    	UNION ALL
    
    	SELECT 
    		Saldo AS Valor
    	FROM
    		Pago i  
    	WHERE i.Dni_alu=@dni 
    )
    SELECT SUM(Valor)
    FROM CTE

    • Propuesto como respuesta Sergio S Arias lunes, 13 de mayo de 2013 13:31
    lunes, 13 de mayo de 2013 7:05
  • Gracias Jesus por tu respuesta, pero me sale este error a ejecutar la creacion de procedure:

      

    create proc [dbo].[DeudaTotalAlumno]
    @dni char(8)
     

      WITH CTE
    AS
    (
    SELECT 
    Importe AS Valor
    FROM 
    Pensiones p  
    WHERE
    Estado = '1' and p.Dni_alu=@dni)   

    UNION ALL

    SELECT 
    Saldo AS Valor
    FROM
    Pago i  
    WHERE i.Dni_alu=@dni 
    )
    SELECT SUM(Valor)
    FROM CTE

    --

    el error que me sale es esto.

    Mens 195, Nivel 15, Estado 1, Procedimiento DeudaTotalAlumno, Línea 13
    'CTE' no es un opción reconocido.
    Mens 102, Nivel 15, Estado 1, Procedimiento DeudaTotalAlumno, Línea 30
    Sintaxis incorrecta cerca de ')'.

    porfavor dime donde esta el error o que me falto poner

    gracias


    lunes, 13 de mayo de 2013 16:59
  • Debes poner un ; antes del WITH, algo así

    ;WITH CTE
    AS
    (
    SELECT 
    Importe AS Valor
    FROM 
    Pensiones p  
    WHERE
    Estado = '1' and p.Dni_alu=@dni)   

    Aunque no estoy seguro si es el único error, prueba y nos dices.


    Sergio Sánchez Arias
    AYÚDANOS A AYUDARTE

    lunes, 13 de mayo de 2013 17:12
  • Hola sergio le coloque el ; siguiendo tu sugerencia:

    create proc [dbo].[DeudaTotalAlumno]
    @dni char(8)
     

      ;WITH CTE
    AS
    (
    SELECT 
    Importe AS Valor
    FROM 
    Pensiones p  
    WHERE
    Estado = '1' and p.Dni_alu=@dni)   

    UNION ALL

    SELECT 
    Saldo AS Valor
    FROM
    Pago i  
    WHERE i.Dni_alu=@dni 
    )
    SELECT SUM(Valor)
    FROM CTE

    y ahora me dice: 

    Mens 102, Nivel 15, Estado 1, Procedimiento DeudaTotalAlumno, Línea 13
    Sintaxis incorrecta cerca de ';'.
    Mens 137, Nivel 15, Estado 2, Procedimiento DeudaTotalAlumno, Línea 21
    Debe declarar la variable escalar "@dni".
    Mens 137, Nivel 15, Estado 2, Procedimiento DeudaTotalAlumno, Línea 29
    Debe declarar la variable escalar "@dni".

    de verdad gracias por su ayuda, espero me puedan ayudar a solucionarlo

    gracias


    lunes, 13 de mayo de 2013 17:26
  • Prueba así, si no estoy equivocado tenías un parentesís demás 

    create proc [dbo].[DeudaTotalAlumno]
    @dni char(8)
     
     AS
    ;WITH CTE
    AS
    (
    	SELECT 
    	Importe AS Valor
    	FROM 
    	Pensiones p  
    	WHERE
    	Estado = '1' and p.Dni_alu=@dni  
    
    	UNION ALL
    
    	SELECT 
    	Saldo AS Valor
    	FROM
    	Pago i  
    	WHERE i.Dni_alu=@dni 
    )
    SELECT SUM(Valor)
    FROM CTE

    Y si ya tienes create tu procedimiento, cambia el CREATE por ALTER.


    Sergio Sánchez Arias
    AYÚDANOS A AYUDARTE

    • Marcado como respuesta Aldo Salazar lunes, 13 de mayo de 2013 17:47
    lunes, 13 de mayo de 2013 17:39
  • ¡¡¡PERFECTO¡¡¡ AHORA SI YA FUNCIONO, MUCHAS GRACIAS A TODOS EN ESPECIAL A SergioSA  POR SU GRAN AYUDA

    ESPERO MUY PRONTO SER DE GRAN AYUDA TAMBIEN... AHORA ME PONDRE A INVESTIGAR PARA QUE SIRVE EL WITH

    MUCHAS GRACIAS

    lunes, 13 de mayo de 2013 17:47
  • Cual es la version de SQL Server que usas o la instancia a la que accesas con esta consulta?

    Las CTEs o expresiones comunes de tablas fueron introducidas con SQL Server 2005. El punto y comma debe colocarse como caracter de finalizacion en la sentencia que le precede si es que existe alguna.

    Puedes usar una tabla derivada tambien o la funcion ISNULL en tu sentencia original.

    SELECT
    	ISNULL( 
    	(
    	select sum(Importe) 
    	FROM Pensiones 
    	where Estado = '1' and p.Dni_alu=@dni
    	), 0)   + 
    	
    	ISNULL (
    	(
    	Select sum(Saldo) 
    	FROM Pago
    	where i.Dni_alu=@dni
    	), 0) as Total;
    GO
    select sum(c1) as Total
    from (
    	select sum(Importe) as c1
    	FROM Pensiones 
    	where Estado = '1' and p.Dni_alu=@dni
    	 
    	union all
    	Select sum(Saldo) as c1
    	FROM Pago
    	where i.Dni_alu=@dni
    ) as T;
    GO


    AMB

    Some guidelines for posting questions...


    lunes, 13 de mayo de 2013 17:52
  • mi version es: Microsoft SQL Server 2008 (SP3) - 10.0.5512.0 (X64)   Aug 22 2012 19:25:47   Copyright (c) 1988-2008 Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 

    visto con select @@version

    la sentencia que me funciona  es :

    create proc [dbo].[DeudaTotalAlumno]
    @dni char(8)
     
     AS
    ;WITH CTE
    AS
    (
    SELECT 
    Importe AS Valor
    FROM 
    Pensiones p  
    WHERE
    Estado = '1' and p.Dni_alu=@dni  

    UNION ALL

    SELECT 
    Saldo AS Valor
    FROM
    Pago i  
    WHERE i.Dni_alu=@dni 
    )
    SELECT SUM(Valor)as 'Deuda Total'
    FROM CTE

    --sugerencia de SergioSA

    gracias

    lunes, 13 de mayo de 2013 17:57
  • Como bien comente antes no necesitas el punto y coma si la declaracion de la CTE no es precedida por otra sentencia.

    Una sugerencia extra seria que use los caracteres "[" y "]" para los casos de nombres de identificadores que contengan caracteres no validos. En vez de 'Deuda Total' deberias usar [Deuda Total]. Otra sugesrencia seria que uses SET NOCOUNT OFF al comienzo de tus procedimientos si deseas evitar que el mensaje sobre filas afectadoas sea procesado en la aplicacion cliente como un resultado mas de tu ejecucion.


    AMB

    Some guidelines for posting questions...


    • Editado HunchbackMVP lunes, 13 de mayo de 2013 18:03
    • Marcado como respuesta Aldo Salazar lunes, 13 de mayo de 2013 18:45
    lunes, 13 de mayo de 2013 18:01
  • tambien funciono  sin el ;

    gracias Hunchback

    lunes, 13 de mayo de 2013 18:45