none
Ayuda con Calculo Masivo... RRS feed

  • Pregunta

  • Buenas ojalas que me puedan ayudar.

    Por ejemplo hago dos calculos por DNI.
    Quisiera Hacer el calculo por ejemplo del DNI "12345678"

    Select sum(saldos) from movimientos where tipodeproceso='Compra' y where DNI='12345678'

    Y eso lo asigno a la variable SumatoriadeCompra.

    Select sum(saldos) from movimientos where tipodeproceso='Venta' y where DNI='12345678'

    Y eso lo asigno a la variable SumatoriadeVenta.
    Entonces para sacar el resultado Hago..
    ResultadoFinal= SumatoriadeCompra-SumatoriadeVenta.

    A si saco la el ResultadoFinal Buscando los datos por el DNI.
    Todo esto esta en una funcion.
    Son Dos Dudas:
    La Primera es Como Podria Hacer esas dos consultas en una sola.
    La Segunda y las mas importante como podria hacer en una consulta, si es que se puede, el calculo de varios DNI.
    Osea si por ejemplo quisiera sacar el calculo de 5 DNI diferentes, tendria que ejecutar la funcion por cada DNI?
    o en una sola consulta podria hacer el calculo con todos los DNI, haciendo un select, creo q tb se pueden usar cursores o algo asi, la verdad que estoy perdido y me prefiero que me salga una tabla con los dni y su resultado final, a que tenga ejecutar la funcion uno por uno, pasandole como parametro el DNI.

    Espero que me halla podido explicar y que me puedan ayudar gracias.

    Leandro Tuttini me ayudo de esta forma en la q podria hacerle

    SELECT SUM(suma1 + suma2) as ResultadoFinal FROM (Select DNI, sum(saldos) as suma1 from movimientos GROUP BY DNI where tipodeproceso='Compra' ) T1 INNER JOIN (Select DNI, sum(saldos) as suma2 from movimientos GROUP BY DNI where tipodeproceso='Venta') T2 ON T1.DNI= T2.DNI

    where DNI='12345678'

    Pero yo le dije lo siguiente:

    "hice tu consulta de otra forma y si me salio, como queria pero el problema es que me salen los datos solo cuando la persona con ese DNI, hizo un movimiento de compra y de venta, osea si solo hizo un movimiento, por ejemplo de tipodeproceso='Compra' , como hago el inner join, no me lo mostraria, pues no hizo una "venta", entonces no podria obtener su informacion, espero que me ayudes gracias..."

    Espero que me puedan ayudar gracias...

    sábado, 10 de agosto de 2013 22:48

Respuestas

  • Creo que se debería modificar un poquito la query

    SELECT SUM(ISNULL(suma1, 0) - ISNULL(suma2, 0)) as ResultadoFinal
    FROM
    	(Select DNI, sum(saldos) as suma1 
    		from movimientos 
    		GROUP BY DNI
    		where tipodeproceso='Compra' ) T1
    LEFT JOIN
    	(Select DNI, sum(saldos) as suma2 
    	from movimientos  
    	GROUP BY DNI
    	where tipodeproceso='Venta') T2
    ON T1.DNI= T2.DNI where DNI='12345678'


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    • Marcado como respuesta Uriel Almendra martes, 27 de agosto de 2013 20:52
    sábado, 10 de agosto de 2013 23:00
  • Hola.

    Sólo has de sumar las compras y restar las ventas:

    Select DNI, 
      sum(case when tipomovimiento='compra' then saldos else -1*saldos end) as suma1 
    from movimientos 
    GROUP BY DNI

    Sí no es eso, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    domingo, 11 de agosto de 2013 11:25
    Moderador
  • Hola DjReTsAm,

    Yo te propondría una alternativa tipo:

    SELECT D.item as Dni, SUM(MC.saldos) - SUM(MV.saldos) as ResultadoFinal
    FROM
    	dbo.Split(@dnis) D inner join
    	movimientos MC on (MC.Dni = D.item) inner join
    	movimientos MV on (MV.Dni = D.item)
    where
    	tipodeproceso='Compra' AND
    	tipodeproceso='Venta'

    Para ello tendrás que añadir antes la función que te hace el Split de los Dnis (esto espera un comalista de dnis):

    CREATE FUNCTION [dbo].[Split](
    	@sInputList VARCHAR(8000),
    	@sDelimiter VARCHAR(8000) = ','
    ) RETURNS @List TABLE (item VARCHAR(8000) COLLATE Modern_Spanish_CI_AI)
    BEGIN
    	DECLARE @sItem VARCHAR(8000)
    	WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
    	BEGIN
    		SELECT
    			@sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),
    			@sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList)))) 	
    		IF LEN(@sItem) > 0
    			INSERT INTO @List SELECT @sItem
    	END
    
    	IF LEN(@sInputList) > 0
    		INSERT INTO @List SELECT @sInputList -- Put the last item in
    	RETURN
    END

    Espero haberte ayudado


    @XaviPaper
    http://geeks.ms/blogs/xavipaper

    • Marcado como respuesta Uriel Almendra martes, 27 de agosto de 2013 20:52
    domingo, 11 de agosto de 2013 23:40

Todas las respuestas

  • Creo que se debería modificar un poquito la query

    SELECT SUM(ISNULL(suma1, 0) - ISNULL(suma2, 0)) as ResultadoFinal
    FROM
    	(Select DNI, sum(saldos) as suma1 
    		from movimientos 
    		GROUP BY DNI
    		where tipodeproceso='Compra' ) T1
    LEFT JOIN
    	(Select DNI, sum(saldos) as suma2 
    	from movimientos  
    	GROUP BY DNI
    	where tipodeproceso='Venta') T2
    ON T1.DNI= T2.DNI where DNI='12345678'


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    • Marcado como respuesta Uriel Almendra martes, 27 de agosto de 2013 20:52
    sábado, 10 de agosto de 2013 23:00
  • Hola.

    Sólo has de sumar las compras y restar las ventas:

    Select DNI, 
      sum(case when tipomovimiento='compra' then saldos else -1*saldos end) as suma1 
    from movimientos 
    GROUP BY DNI

    Sí no es eso, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    domingo, 11 de agosto de 2013 11:25
    Moderador
  • Hola DjReTsAm,

    Yo te propondría una alternativa tipo:

    SELECT D.item as Dni, SUM(MC.saldos) - SUM(MV.saldos) as ResultadoFinal
    FROM
    	dbo.Split(@dnis) D inner join
    	movimientos MC on (MC.Dni = D.item) inner join
    	movimientos MV on (MV.Dni = D.item)
    where
    	tipodeproceso='Compra' AND
    	tipodeproceso='Venta'

    Para ello tendrás que añadir antes la función que te hace el Split de los Dnis (esto espera un comalista de dnis):

    CREATE FUNCTION [dbo].[Split](
    	@sInputList VARCHAR(8000),
    	@sDelimiter VARCHAR(8000) = ','
    ) RETURNS @List TABLE (item VARCHAR(8000) COLLATE Modern_Spanish_CI_AI)
    BEGIN
    	DECLARE @sItem VARCHAR(8000)
    	WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
    	BEGIN
    		SELECT
    			@sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),
    			@sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList)))) 	
    		IF LEN(@sItem) > 0
    			INSERT INTO @List SELECT @sItem
    	END
    
    	IF LEN(@sInputList) > 0
    		INSERT INTO @List SELECT @sInputList -- Put the last item in
    	RETURN
    END

    Espero haberte ayudado


    @XaviPaper
    http://geeks.ms/blogs/xavipaper

    • Marcado como respuesta Uriel Almendra martes, 27 de agosto de 2013 20:52
    domingo, 11 de agosto de 2013 23:40