none
COMO RESTAR DOS VARIABLES EN SQL RRS feed

  • Pregunta

  • Hola,

    Trabajo con SQL Server 2014 y necesito restar el valor de dos variables ya definidas con anterioridad.

    DECLARE @VENTANECESARIAENALMACEN2 decimal(15,5)
    
    SET @VENTANECESARIAENALMACEN2 = (
    	   SELECT
    		  0.1*SUM(a) 
    	   FROM 
    		  (
    			 SELECT SUM(accimp2) AS a FROM NCONGE16.DBO.ALBARANCC 
    				WHERE ACCFEC = '08/01/2016' AND ACCRPRCOD IN (465000001,465000004) 
    			 UNION ALL 
    			 SELECT SUM(accimp2) FROM NCONGE162.DBO.ALBARANCC 
    				WHERE ACCFEc = '08/01/2016' AND ACCRPRCOD IN (465000001,465000004)
    		  ) AS T)  
    
    PRINT @VENTANECESARIAENALMACEN2
    GO
    
    DECLARE @VENTAALMACEN2 decimal(15,5)
    
    SET @VENTAALMACEN2 = (
    	   SELECT SUM(ACCIMP2) FROM ALBARANCC WHERE ACCFEC='08/01/2016' AND  ACCRPRCOD='465000004' )  
    
    PRINT @VENTAALMACEN2
    GO
    
    DECLARE @VENTAALMACEN2FALTANTE DECIMAL(15,5)
    
    SET @VENTAALMACEN2FALTANTE=@VENTANECESARIAENALMACEN2-@VENTAALMACEN2


    Obtengo el error: 

    Mens. 137, Nivel 15, Estado 2, Línea 28
    Debe declarar la variable escalar "@VENTANECESARIAENALMACEN2".

    Alguna idea de qué puede estar ocurriendo?

    Gracias

    Angel

     
    martes, 24 de enero de 2017 19:23

Respuestas

  • Angeleci,

    Puedes contener los resultados en una sola fila y luego operar con ellos:

    WITH T AS 
    (
        SELECT
    	   (SELECT SUM(accimp2) AS a FROM NCONGE16.DBO.ALBARANCC 
    		  WHERE ACCFEC = '08/01/2016' AND ACCRPRCOD IN (465000001,465000004)) +
    	   (SELECT SUM(accimp2) FROM NCONGE162.DBO.ALBARANCC 
    		  WHERE ACCFEc = '08/01/2016' AND ACCRPRCOD IN (465000001,465000004)) 
    			 AS [VENTANECESARIAENALMACEN2],
    	   (SELECT SUM(ACCIMP2) FROM ALBARANCC 
    		  WHERE ACCFEC = '08/01/2016' AND ACCRPRCOD = '465000004') AS [VENTAALMACEN2]
    )
    SELECT (t1.VENTANECESARIAENALMACEN2 * 0.1) - t1.VENTAALMACEN2 FROM T t1;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Angeleci miércoles, 25 de enero de 2017 12:52
    martes, 24 de enero de 2017 20:12
  • Hola Angeleci, el problema que tienes son los "GO", si quieres que te funcione quita los GO, estos indican el final de un lote de instrucciones en SQL, es como si tuvieras 3 consultas en ese codigo que se ejecutan por separado, te voy a dejar un link donde puedes conocer mejor.

    Uso del go

    Saludos.

    • Marcado como respuesta Angeleci miércoles, 25 de enero de 2017 12:52
    martes, 24 de enero de 2017 19:40

Todas las respuestas

  • Hola Angeleci, el problema que tienes son los "GO", si quieres que te funcione quita los GO, estos indican el final de un lote de instrucciones en SQL, es como si tuvieras 3 consultas en ese codigo que se ejecutan por separado, te voy a dejar un link donde puedes conocer mejor.

    Uso del go

    Saludos.

    • Marcado como respuesta Angeleci miércoles, 25 de enero de 2017 12:52
    martes, 24 de enero de 2017 19:40
  • Angeleci,

    Puedes contener los resultados en una sola fila y luego operar con ellos:

    WITH T AS 
    (
        SELECT
    	   (SELECT SUM(accimp2) AS a FROM NCONGE16.DBO.ALBARANCC 
    		  WHERE ACCFEC = '08/01/2016' AND ACCRPRCOD IN (465000001,465000004)) +
    	   (SELECT SUM(accimp2) FROM NCONGE162.DBO.ALBARANCC 
    		  WHERE ACCFEc = '08/01/2016' AND ACCRPRCOD IN (465000001,465000004)) 
    			 AS [VENTANECESARIAENALMACEN2],
    	   (SELECT SUM(ACCIMP2) FROM ALBARANCC 
    		  WHERE ACCFEC = '08/01/2016' AND ACCRPRCOD = '465000004') AS [VENTAALMACEN2]
    )
    SELECT (t1.VENTANECESARIAENALMACEN2 * 0.1) - t1.VENTAALMACEN2 FROM T t1;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Angeleci miércoles, 25 de enero de 2017 12:52
    martes, 24 de enero de 2017 20:12
  • Hola de nuevo Willams.

    Tirando de la solución que me propones me surge el siguiente problema.

    Resulta que el select que forma el segundo sumado de la expresión no arroja ningún resultado. Pues bien, cuando eso ocurre la expresión completa 

     SELECT
    	   (SELECT SUM(accimp2) AS a FROM basura.dbo.ALBARANCC 
    		  WHERE ACCFEC = '03/01/2017' AND ACCRPRCOD IN (465000001,465000004))
    		   +
    	   (SELECT SUM(accimp2) FROM basura2.dbo.ALBARANCC 
    		  WHERE ACCFEC = '03/01/2017' AND ACCRPRCOD IN (465000001,465000004)) 

    me arroja un valor null.

    Mas detalle en la imagen.

    ¿sabrías decirme que podría probar para evitar que ocurra esto? He hecho las pruebas cambiando registros en la base de datos y en cuanto ambos sumando arrojan valores funciona sin problema alguno.

    Gracias

    miércoles, 25 de enero de 2017 16:24
  • Angeleci,

    En caso la subconsulta retorne NULL debes convertir a cero, y para ello puedes hacer uso de la función COALESCE():

    COALESCE (Transact-SQL)

    WITH T AS 
    (
        SELECT
    	   COALESCE((SELECT SUM(accimp2) AS a FROM NCONGE16.DBO.ALBARANCC 
    		  WHERE ACCFEC = '08/01/2016' AND ACCRPRCOD IN (465000001,465000004)), 0) +
    	   COALESCE((SELECT SUM(accimp2) FROM NCONGE162.DBO.ALBARANCC 
    		  WHERE ACCFEc = '08/01/2016' AND ACCRPRCOD IN (465000001,465000004)), 0) 
    			 AS [VENTANECESARIAENALMACEN2],
    	   COALESCE((SELECT SUM(ACCIMP2) FROM ALBARANCC 
    		  WHERE ACCFEC = '08/01/2016' AND ACCRPRCOD = '465000004'), 0) AS [VENTAALMACEN2]
    )
    SELECT (t1.VENTANECESARIAENALMACEN2 * 0.1) - t1.VENTAALMACEN2 FROM T t1;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 25 de enero de 2017 16:44