SQLServer me devuelve 0 en una division..

26/08/2005 - 19:34 por Lord Voldemort | Informe spam
Hola a tod@s

en un SP cuando intento realizar una division entre dos campos y el numero
es menor que cero, sql devuelve 0, cuando deveria de ser 0.45
0.53 o 0.83

los tipos de campo son smallmoney o money

Gracias por su atencion..

Voldemort...

Preguntas similare

Leer las respuestas

#6 Lord Voldemort
26/08/2005 - 22:26 | Informe spam
Ale..
y como haria entonces con esto..?

((SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) -
(SUM(dbo.Mortalidad.Hembras) + SUM(dbo.Mortalidad.Machos)))/
(SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) AS
SobreVivencia



pues tu me das un ejemplo con el resultado pero con los campos como seria?

gracias


"Alejandro Mesa" wrote in message
news:
En t-sql, la division de enteros da como resultado un entero. Debes
convertir
el valor a numeric / decimal para obtener decimales. Puedes hacer la
conversion de forma implicta o explicita.

select
4981/5000 as c1, -- entero data entero
4981.00 / 5000 as c2, -- al usar .00 sql server lo considera decimal
cast(4981 as decimal(6, 2)) / 5000
go


AMB

"Lord Voldemort" wrote:

Hola Gustavo y Ale... copio la consulta..

SELECT dbo.Fases.Codigo, SUM(dbo.Movimientos.Hembras) AS HembrasSem,
SUM(dbo.Movimientos.Machos) AS MachosSem,
SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos) AS TotalSem,
SUM(dbo.Mortalidad.Hembras) AS HembrasMor,
SUM(dbo.Mortalidad.Machos) AS MachosMor, SUM(dbo.Mortalidad.Hembras) +
SUM(dbo.Mortalidad.Machos) AS TotalMor,
(SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) -
(SUM(dbo.Mortalidad.Hembras) + SUM(dbo.Mortalidad.Machos)) AS Cosecha,
dbo.TanquesFases.IDFase AS IDFase,
((SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) -
(SUM(dbo.Mortalidad.Hembras) + SUM(dbo.Mortalidad.Machos)))/
(SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) AS
SobreVivencia /* aqui en sobrevivencia me devuelve cero 0 */
FROM dbo.Mortalidad INNER JOIN
dbo.Movimientos ON dbo.Mortalidad.IDMovimiento =
dbo.Movimientos.IDMovimiento INNER JOIN
dbo.TanquesFases ON dbo.Movimientos.IDTanqueFase =
dbo.TanquesFases.IdTanqueFase INNER JOIN
dbo.Fases ON dbo.TanquesFases.IDFase = dbo.Fases.IDFase
WHERE (dbo.Fases.IdSala = 1) AND (dbo.Movimientos.Status = 1)
GROUP BY dbo.TanquesFases.IDFase, dbo.Fases.Codigo

al ejecutar esto resultan estos datos

FASE I 2500 2500 5000 11 8 19 4981 5 0
FASE II 2338 2331 4669 6 12 18 4651 6 0
FASE III 1200 1200 2400 9 10 19 2381 7 0

en este caso quiero encontrar el porcentaje... 4981/5000 >>
4651/4669 >>
2381/2400 >>
en respuesta me sale 0 para todas...


gacias por su tiempo..

Voldemort

"Gustavo Larriera [MVP]" wrote in message
news:
> Muéstranos cómo haces la divisón, qué valores pruebas y qué resultado
> correcto esperas tener.
>
> Gustavo Larriera
> Uruguay LatAm
> Blog: http://sqljunkies.com/weblog/gux/
> MVP profile: http://aspnet2.com/mvp.ashx?GustavoLarriera
> Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga
> ningun
> derecho / This posting is provided "AS IS" with no warranties, and
> confers
> no rights.
>
> "Lord Voldemort" <@@> wrote in message
> news:%
>> Hola a
>>
>> en un SP cuando intento realizar una division entre dos campos y el
>> numero
>> es menor que cero, sql devuelve 0, cuando deveria de ser 0.45
>> 0.53 o 0.83
>>
>> los tipos de campo son smallmoney o money
>>
>> Gracias por su atencion..
>>
>> Voldemort...
>>
>>
>>
>>
>>
>
>
Respuesta Responder a este mensaje
#7 Alejandro Mesa
26/08/2005 - 22:37 | Informe spam
Trata:

((SUM(dbo.Movimientos.Hembras * 1.00) + SUM(dbo.Movimientos.Machos)) -
(SUM(dbo.Mortalidad.Hembras * 1.00) + SUM(dbo.Mortalidad.Machos))) /
nullif((SUM(dbo.Movimientos.Hembras * 1.00) + SUM(dbo.Movimientos.Machos)))
AS SobreVivencia

Multiplica el valor de la columna por 1.00 y haces una conversion implicita.
Puedes hacerlo en cualquier columna, no necesariamente "hembras". El "nullif"
es para prevenir un error de division por cero.


AMB

"Lord Voldemort" wrote:

Ale..
y como haria entonces con esto..?

> ((SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) -
> (SUM(dbo.Mortalidad.Hembras) + SUM(dbo.Mortalidad.Machos)))/
> (SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) AS
> SobreVivencia

pues tu me das un ejemplo con el resultado pero con los campos como seria?

gracias


"Alejandro Mesa" wrote in message
news:
> En t-sql, la division de enteros da como resultado un entero. Debes
> convertir
> el valor a numeric / decimal para obtener decimales. Puedes hacer la
> conversion de forma implicta o explicita.
>
> select
> 4981/5000 as c1, -- entero data entero
> 4981.00 / 5000 as c2, -- al usar .00 sql server lo considera decimal
> cast(4981 as decimal(6, 2)) / 5000
> go
>
>
> AMB
>
> "Lord Voldemort" wrote:
>
>> Hola Gustavo y Ale... copio la consulta..
>>
>> SELECT dbo.Fases.Codigo, SUM(dbo.Movimientos.Hembras) AS HembrasSem,
>> SUM(dbo.Movimientos.Machos) AS MachosSem,
>> SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos) AS TotalSem,
>> SUM(dbo.Mortalidad.Hembras) AS HembrasMor,
>> SUM(dbo.Mortalidad.Machos) AS MachosMor, SUM(dbo.Mortalidad.Hembras) +
>> SUM(dbo.Mortalidad.Machos) AS TotalMor,
>> (SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) -
>> (SUM(dbo.Mortalidad.Hembras) + SUM(dbo.Mortalidad.Machos)) AS Cosecha,
>> dbo.TanquesFases.IDFase AS IDFase,
>> ((SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) -
>> (SUM(dbo.Mortalidad.Hembras) + SUM(dbo.Mortalidad.Machos)))/
>> (SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) AS
>> SobreVivencia /* aqui en sobrevivencia me devuelve cero 0 */
>> FROM dbo.Mortalidad INNER JOIN
>> dbo.Movimientos ON dbo.Mortalidad.IDMovimiento =
>> dbo.Movimientos.IDMovimiento INNER JOIN
>> dbo.TanquesFases ON dbo.Movimientos.IDTanqueFase =
>> dbo.TanquesFases.IdTanqueFase INNER JOIN
>> dbo.Fases ON dbo.TanquesFases.IDFase = dbo.Fases.IDFase
>> WHERE (dbo.Fases.IdSala = 1) AND (dbo.Movimientos.Status = 1)
>> GROUP BY dbo.TanquesFases.IDFase, dbo.Fases.Codigo
>>
>> al ejecutar esto resultan estos datos
>>
>> FASE I 2500 2500 5000 11 8 19 4981 5 0
>> FASE II 2338 2331 4669 6 12 18 4651 6 0
>> FASE III 1200 1200 2400 9 10 19 2381 7 0
>>
>> en este caso quiero encontrar el porcentaje... 4981/5000 > >>
>> 4651/4669 > >>
>> 2381/2400 > >>
>> en respuesta me sale 0 para todas...
>>
>>
>> gacias por su tiempo..
>>
>> Voldemort
>>
>> "Gustavo Larriera [MVP]" wrote in message
>> news:
>> > Muéstranos cómo haces la divisón, qué valores pruebas y qué resultado
>> > correcto esperas tener.
>> >
>> > Gustavo Larriera
>> > Uruguay LatAm
>> > Blog: http://sqljunkies.com/weblog/gux/
>> > MVP profile: http://aspnet2.com/mvp.ashx?GustavoLarriera
>> > Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga
>> > ningun
>> > derecho / This posting is provided "AS IS" with no warranties, and
>> > confers
>> > no rights.
>> >
>> > "Lord Voldemort" <@@> wrote in message
>> > news:%
>> >> Hola a
>> >>
>> >> en un SP cuando intento realizar una division entre dos campos y el
>> >> numero
>> >> es menor que cero, sql devuelve 0, cuando deveria de ser 0.45
>> >> 0.53 o 0.83
>> >>
>> >> los tipos de campo son smallmoney o money
>> >>
>> >> Gracias por su atencion..
>> >>
>> >> Voldemort...
>> >>
>> >>
>> >>
>> >>
>> >>
>> >
>> >



Respuesta Responder a este mensaje
#8 Lord Voldemort
27/08/2005 - 00:04 | Informe spam
Excelente Alejandro, funciona Gracias..

sabes eso del nullif.. para que diablos es???
bueno me pasa que a veces al sumar un campo con otro campo que tiene valor
nulo entonces el resultado devuelve nulo aunque uno de los datos contenga un
numero..


saludos..

Voldemort
"Alejandro Mesa" wrote in message
news:
Trata:

((SUM(dbo.Movimientos.Hembras * 1.00) + SUM(dbo.Movimientos.Machos)) -
(SUM(dbo.Mortalidad.Hembras * 1.00) + SUM(dbo.Mortalidad.Machos))) /
nullif((SUM(dbo.Movimientos.Hembras * 1.00) +
SUM(dbo.Movimientos.Machos)))
AS SobreVivencia

Multiplica el valor de la columna por 1.00 y haces una conversion
implicita.
Puedes hacerlo en cualquier columna, no necesariamente "hembras". El
"nullif"
es para prevenir un error de division por cero.


AMB

"Lord Voldemort" wrote:

Ale..
y como haria entonces con esto..?

> ((SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) -
> (SUM(dbo.Mortalidad.Hembras) + SUM(dbo.Mortalidad.Machos)))/
> (SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) AS
> SobreVivencia

pues tu me das un ejemplo con el resultado pero con los campos como
seria?

gracias


"Alejandro Mesa" wrote in
message
news:
> En t-sql, la division de enteros da como resultado un entero. Debes
> convertir
> el valor a numeric / decimal para obtener decimales. Puedes hacer la
> conversion de forma implicta o explicita.
>
> select
> 4981/5000 as c1, -- entero data entero
> 4981.00 / 5000 as c2, -- al usar .00 sql server lo considera decimal
> cast(4981 as decimal(6, 2)) / 5000
> go
>
>
> AMB
>
> "Lord Voldemort" wrote:
>
>> Hola Gustavo y Ale... copio la consulta..
>>
>> SELECT dbo.Fases.Codigo, SUM(dbo.Movimientos.Hembras) AS
>> HembrasSem,
>> SUM(dbo.Movimientos.Machos) AS MachosSem,
>> SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos) AS
>> TotalSem,
>> SUM(dbo.Mortalidad.Hembras) AS HembrasMor,
>> SUM(dbo.Mortalidad.Machos) AS MachosMor, SUM(dbo.Mortalidad.Hembras)
>> +
>> SUM(dbo.Mortalidad.Machos) AS TotalMor,
>> (SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) -
>> (SUM(dbo.Mortalidad.Hembras) + SUM(dbo.Mortalidad.Machos)) AS Cosecha,
>> dbo.TanquesFases.IDFase AS IDFase,
>> ((SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) -
>> (SUM(dbo.Mortalidad.Hembras) + SUM(dbo.Mortalidad.Machos)))/
>> (SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) AS
>> SobreVivencia /* aqui en sobrevivencia me devuelve cero 0 */
>> FROM dbo.Mortalidad INNER JOIN
>> dbo.Movimientos ON dbo.Mortalidad.IDMovimiento >> >> dbo.Movimientos.IDMovimiento INNER JOIN
>> dbo.TanquesFases ON dbo.Movimientos.IDTanqueFase >> >> dbo.TanquesFases.IdTanqueFase INNER JOIN
>> dbo.Fases ON dbo.TanquesFases.IDFase = dbo.Fases.IDFase
>> WHERE (dbo.Fases.IdSala = 1) AND (dbo.Movimientos.Status = 1)
>> GROUP BY dbo.TanquesFases.IDFase, dbo.Fases.Codigo
>>
>> al ejecutar esto resultan estos datos
>>
>> FASE I 2500 2500 5000 11 8 19 4981 5 0
>> FASE II 2338 2331 4669 6 12 18 4651 6 0
>> FASE III 1200 1200 2400 9 10 19 2381 7 0
>>
>> en este caso quiero encontrar el porcentaje... 4981/5000 >> >>
>> 4651/4669 >> >>
>> 2381/2400 >> >>
>> en respuesta me sale 0 para todas...
>>
>>
>> gacias por su tiempo..
>>
>> Voldemort
>>
>> "Gustavo Larriera [MVP]" wrote in message
>> news:
>> > Muéstranos cómo haces la divisón, qué valores pruebas y qué
>> > resultado
>> > correcto esperas tener.
>> >
>> > Gustavo Larriera
>> > Uruguay LatAm
>> > Blog: http://sqljunkies.com/weblog/gux/
>> > MVP profile: http://aspnet2.com/mvp.ashx?GustavoLarriera
>> > Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga
>> > ningun
>> > derecho / This posting is provided "AS IS" with no warranties, and
>> > confers
>> > no rights.
>> >
>> > "Lord Voldemort" <@@> wrote in message
>> > news:%
>> >> Hola a
>> >>
>> >> en un SP cuando intento realizar una division entre dos campos y el
>> >> numero
>> >> es menor que cero, sql devuelve 0, cuando deveria de ser 0.45
>> >> 0.53 o 0.83
>> >>
>> >> los tipos de campo son smallmoney o money
>> >>
>> >> Gracias por su atencion..
>> >>
>> >> Voldemort...
>> >>
>> >>
>> >>
>> >>
>> >>
>> >
>> >



Respuesta Responder a este mensaje
#9 Alejandro Mesa
27/08/2005 - 13:31 | Informe spam
En t-sql, la unica operacion que se puede hacer sobre un valor NULL es el de
comparacion, usando:

expresion is [not] null

donde expresion puede ser desde una columna, hasta una variable.

Ejemplo:

select *
from dbo.orders
where shippeddate is not null

cualquier otra operacion que involucre un valor NULL, dara como resultado
NULL.

Ejemplo:

select cast(null as int) + 1
select cast(null as int) / 1
select cast(null as int) - 1
select cast(null as int) * 1
select 1 where null = null
select 1 where null != null
select 1 where 1 = null
select 1 where 'microsoft' = null
select 1 where 'microsoft' != null

Para evitar un valor NULL en una expresion, puedes usar las funciones ISNULL
o COALESCE, las cuales devuelven un valor x si si el valor en question es
cero. La diferencia entre ambas son:

- isnull devuelve un valor cuyo tipo es igual al tipo de dato del primer
argumento
- coalesce puede tranajar con una lista, devolviendo el primer elemento de
la lista que no es null y ademas el tipo de datos del resultado sera el de
mayor precedencia en la lista

Ejemplo:

select isnull(cast(null as int), 0) + 3
select coalesce(cast(null as int), 0) - 5

Si en una operacion de division, el divisor es cero, sql server dara un error:

select 1 / 0

para evitar esto, podemos usar la funcion NULLIF, la cual devuelve un valor
NULL si el primer argumento es igual al segundo.

select 1 / nullif(0, 0)
select sum(x) / nullif(sum(y), 0) from t


AMB

"Lord Voldemort" wrote:

Excelente Alejandro, funciona Gracias..

sabes eso del nullif.. para que diablos es???
bueno me pasa que a veces al sumar un campo con otro campo que tiene valor
nulo entonces el resultado devuelve nulo aunque uno de los datos contenga un
numero..


saludos..

Voldemort
"Alejandro Mesa" wrote in message
news:
> Trata:
>
> ((SUM(dbo.Movimientos.Hembras * 1.00) + SUM(dbo.Movimientos.Machos)) -
> (SUM(dbo.Mortalidad.Hembras * 1.00) + SUM(dbo.Mortalidad.Machos))) /
> nullif((SUM(dbo.Movimientos.Hembras * 1.00) +
> SUM(dbo.Movimientos.Machos)))
> AS SobreVivencia
>
> Multiplica el valor de la columna por 1.00 y haces una conversion
> implicita.
> Puedes hacerlo en cualquier columna, no necesariamente "hembras". El
> "nullif"
> es para prevenir un error de division por cero.
>
>
> AMB
>
> "Lord Voldemort" wrote:
>
>> Ale..
>> y como haria entonces con esto..?
>>
>> > ((SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) -
>> > (SUM(dbo.Mortalidad.Hembras) + SUM(dbo.Mortalidad.Machos)))/
>> > (SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) AS
>> > SobreVivencia
>>
>> pues tu me das un ejemplo con el resultado pero con los campos como
>> seria?
>>
>> gracias
>>
>>
>> "Alejandro Mesa" wrote in
>> message
>> news:
>> > En t-sql, la division de enteros da como resultado un entero. Debes
>> > convertir
>> > el valor a numeric / decimal para obtener decimales. Puedes hacer la
>> > conversion de forma implicta o explicita.
>> >
>> > select
>> > 4981/5000 as c1, -- entero data entero
>> > 4981.00 / 5000 as c2, -- al usar .00 sql server lo considera decimal
>> > cast(4981 as decimal(6, 2)) / 5000
>> > go
>> >
>> >
>> > AMB
>> >
>> > "Lord Voldemort" wrote:
>> >
>> >> Hola Gustavo y Ale... copio la consulta..
>> >>
>> >> SELECT dbo.Fases.Codigo, SUM(dbo.Movimientos.Hembras) AS
>> >> HembrasSem,
>> >> SUM(dbo.Movimientos.Machos) AS MachosSem,
>> >> SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos) AS
>> >> TotalSem,
>> >> SUM(dbo.Mortalidad.Hembras) AS HembrasMor,
>> >> SUM(dbo.Mortalidad.Machos) AS MachosMor, SUM(dbo.Mortalidad.Hembras)
>> >> +
>> >> SUM(dbo.Mortalidad.Machos) AS TotalMor,
>> >> (SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) -
>> >> (SUM(dbo.Mortalidad.Hembras) + SUM(dbo.Mortalidad.Machos)) AS Cosecha,
>> >> dbo.TanquesFases.IDFase AS IDFase,
>> >> ((SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) -
>> >> (SUM(dbo.Mortalidad.Hembras) + SUM(dbo.Mortalidad.Machos)))/
>> >> (SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) AS
>> >> SobreVivencia /* aqui en sobrevivencia me devuelve cero 0 */
>> >> FROM dbo.Mortalidad INNER JOIN
>> >> dbo.Movimientos ON dbo.Mortalidad.IDMovimiento > >> >> dbo.Movimientos.IDMovimiento INNER JOIN
>> >> dbo.TanquesFases ON dbo.Movimientos.IDTanqueFase > >> >> dbo.TanquesFases.IdTanqueFase INNER JOIN
>> >> dbo.Fases ON dbo.TanquesFases.IDFase = dbo.Fases.IDFase
>> >> WHERE (dbo.Fases.IdSala = 1) AND (dbo.Movimientos.Status = 1)
>> >> GROUP BY dbo.TanquesFases.IDFase, dbo.Fases.Codigo
>> >>
>> >> al ejecutar esto resultan estos datos
>> >>
>> >> FASE I 2500 2500 5000 11 8 19 4981 5 0
>> >> FASE II 2338 2331 4669 6 12 18 4651 6 0
>> >> FASE III 1200 1200 2400 9 10 19 2381 7 0
>> >>
>> >> en este caso quiero encontrar el porcentaje... 4981/5000 > >> >>
>> >> 4651/4669 > >> >>
>> >> 2381/2400 > >> >>
>> >> en respuesta me sale 0 para todas...
>> >>
>> >>
>> >> gacias por su tiempo..
>> >>
>> >> Voldemort
>> >>
>> >> "Gustavo Larriera [MVP]" wrote in message
>> >> news:
>> >> > Muéstranos cómo haces la divisón, qué valores pruebas y qué
>> >> > resultado
>> >> > correcto esperas tener.
>> >> >
>> >> > Gustavo Larriera
>> >> > Uruguay LatAm
>> >> > Blog: http://sqljunkies.com/weblog/gux/
>> >> > MVP profile: http://aspnet2.com/mvp.ashx?GustavoLarriera
>> >> > Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga
>> >> > ningun
>> >> > derecho / This posting is provided "AS IS" with no warranties, and
>> >> > confers
>> >> > no rights.
>> >> >
>> >> > "Lord Voldemort" <@@> wrote in message
>> >> > news:%
>> >> >> Hola a
>> >> >>
>> >> >> en un SP cuando intento realizar una division entre dos campos y el
>> >> >> numero
>> >> >> es menor que cero, sql devuelve 0, cuando deveria de ser 0.45
>> >> >> 0.53 o 0.83
>> >> >>
>> >> >> los tipos de campo son smallmoney o money
>> >> >>
>> >> >> Gracias por su atencion..
>> >> >>
>> >> >> Voldemort...
>> >> >>
>> >> >>
>> >> >>
>> >> >>
>> >> >>
>> >> >
>> >> >
>>
>>
>>



Respuesta Responder a este mensaje
#10 Lord Voldemort
29/08/2005 - 16:52 | Informe spam
Ok... ahora sip..

gracias..


"Alejandro Mesa" wrote in message
news:
En t-sql, la unica operacion que se puede hacer sobre un valor NULL es el
de
comparacion, usando:

expresion is [not] null

donde expresion puede ser desde una columna, hasta una variable.

Ejemplo:

select *
from dbo.orders
where shippeddate is not null

cualquier otra operacion que involucre un valor NULL, dara como resultado
NULL.

Ejemplo:

select cast(null as int) + 1
select cast(null as int) / 1
select cast(null as int) - 1
select cast(null as int) * 1
select 1 where null = null
select 1 where null != null
select 1 where 1 = null
select 1 where 'microsoft' = null
select 1 where 'microsoft' != null

Para evitar un valor NULL en una expresion, puedes usar las funciones
ISNULL
o COALESCE, las cuales devuelven un valor x si si el valor en question es
cero. La diferencia entre ambas son:

- isnull devuelve un valor cuyo tipo es igual al tipo de dato del primer
argumento
- coalesce puede tranajar con una lista, devolviendo el primer elemento de
la lista que no es null y ademas el tipo de datos del resultado sera el de
mayor precedencia en la lista

Ejemplo:

select isnull(cast(null as int), 0) + 3
select coalesce(cast(null as int), 0) - 5

Si en una operacion de division, el divisor es cero, sql server dara un
error:

select 1 / 0

para evitar esto, podemos usar la funcion NULLIF, la cual devuelve un
valor
NULL si el primer argumento es igual al segundo.

select 1 / nullif(0, 0)
select sum(x) / nullif(sum(y), 0) from t


AMB

"Lord Voldemort" wrote:

Excelente Alejandro, funciona Gracias..

sabes eso del nullif.. para que diablos es???
bueno me pasa que a veces al sumar un campo con otro campo que tiene
valor
nulo entonces el resultado devuelve nulo aunque uno de los datos contenga
un
numero..


saludos..

Voldemort
"Alejandro Mesa" wrote in
message
news:
> Trata:
>
> ((SUM(dbo.Movimientos.Hembras * 1.00) + SUM(dbo.Movimientos.Machos)) -
> (SUM(dbo.Mortalidad.Hembras * 1.00) + SUM(dbo.Mortalidad.Machos))) /
> nullif((SUM(dbo.Movimientos.Hembras * 1.00) +
> SUM(dbo.Movimientos.Machos)))
> AS SobreVivencia
>
> Multiplica el valor de la columna por 1.00 y haces una conversion
> implicita.
> Puedes hacerlo en cualquier columna, no necesariamente "hembras". El
> "nullif"
> es para prevenir un error de division por cero.
>
>
> AMB
>
> "Lord Voldemort" wrote:
>
>> Ale..
>> y como haria entonces con esto..?
>>
>> > ((SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) -
>> > (SUM(dbo.Mortalidad.Hembras) + SUM(dbo.Mortalidad.Machos)))/
>> > (SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) AS
>> > SobreVivencia
>>
>> pues tu me das un ejemplo con el resultado pero con los campos como
>> seria?
>>
>> gracias
>>
>>
>> "Alejandro Mesa" wrote in
>> message
>> news:
>> > En t-sql, la division de enteros da como resultado un entero. Debes
>> > convertir
>> > el valor a numeric / decimal para obtener decimales. Puedes hacer la
>> > conversion de forma implicta o explicita.
>> >
>> > select
>> > 4981/5000 as c1, -- entero data entero
>> > 4981.00 / 5000 as c2, -- al usar .00 sql server lo considera
>> > decimal
>> > cast(4981 as decimal(6, 2)) / 5000
>> > go
>> >
>> >
>> > AMB
>> >
>> > "Lord Voldemort" wrote:
>> >
>> >> Hola Gustavo y Ale... copio la consulta..
>> >>
>> >> SELECT dbo.Fases.Codigo, SUM(dbo.Movimientos.Hembras) AS
>> >> HembrasSem,
>> >> SUM(dbo.Movimientos.Machos) AS MachosSem,
>> >> SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos) AS
>> >> TotalSem,
>> >> SUM(dbo.Mortalidad.Hembras) AS HembrasMor,
>> >> SUM(dbo.Mortalidad.Machos) AS MachosMor,
>> >> SUM(dbo.Mortalidad.Hembras)
>> >> +
>> >> SUM(dbo.Mortalidad.Machos) AS TotalMor,
>> >> (SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) -
>> >> (SUM(dbo.Mortalidad.Hembras) + SUM(dbo.Mortalidad.Machos)) AS
>> >> Cosecha,
>> >> dbo.TanquesFases.IDFase AS IDFase,
>> >> ((SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) -
>> >> (SUM(dbo.Mortalidad.Hembras) + SUM(dbo.Mortalidad.Machos)))/
>> >> (SUM(dbo.Movimientos.Hembras) + SUM(dbo.Movimientos.Machos)) AS
>> >> SobreVivencia /* aqui en sobrevivencia me devuelve cero 0 */
>> >> FROM dbo.Mortalidad INNER JOIN
>> >> dbo.Movimientos ON dbo.Mortalidad.IDMovimiento >> >> >> dbo.Movimientos.IDMovimiento INNER JOIN
>> >> dbo.TanquesFases ON dbo.Movimientos.IDTanqueFase >> >> >> dbo.TanquesFases.IdTanqueFase INNER JOIN
>> >> dbo.Fases ON dbo.TanquesFases.IDFase = dbo.Fases.IDFase
>> >> WHERE (dbo.Fases.IdSala = 1) AND (dbo.Movimientos.Status =
>> >> 1)
>> >> GROUP BY dbo.TanquesFases.IDFase, dbo.Fases.Codigo
>> >>
>> >> al ejecutar esto resultan estos datos
>> >>
>> >> FASE I 2500 2500 5000 11 8 19 4981 5 0
>> >> FASE II 2338 2331 4669 6 12 18 4651 6 0
>> >> FASE III 1200 1200 2400 9 10 19 2381 7 0
>> >>
>> >> en este caso quiero encontrar el porcentaje... 4981/5000 >> >> >>
>> >> 4651/4669 >> >> >>
>> >> 2381/2400 >> >> >>
>> >> en respuesta me sale 0 para todas...
>> >>
>> >>
>> >> gacias por su tiempo..
>> >>
>> >> Voldemort
>> >>
>> >> "Gustavo Larriera [MVP]" wrote in
>> >> message
>> >> news:
>> >> > Muéstranos cómo haces la divisón, qué valores pruebas y qué
>> >> > resultado
>> >> > correcto esperas tener.
>> >> >
>> >> > Gustavo Larriera
>> >> > Uruguay LatAm
>> >> > Blog: http://sqljunkies.com/weblog/gux/
>> >> > MVP profile: http://aspnet2.com/mvp.ashx?GustavoLarriera
>> >> > Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga
>> >> > ningun
>> >> > derecho / This posting is provided "AS IS" with no warranties,
>> >> > and
>> >> > confers
>> >> > no rights.
>> >> >
>> >> > "Lord Voldemort" <@@> wrote in message
>> >> > news:%
>> >> >> Hola a
>> >> >>
>> >> >> en un SP cuando intento realizar una division entre dos campos y
>> >> >> el
>> >> >> numero
>> >> >> es menor que cero, sql devuelve 0, cuando deveria de ser 0.45
>> >> >> 0.53 o 0.83
>> >> >>
>> >> >> los tipos de campo son smallmoney o money
>> >> >>
>> >> >> Gracias por su atencion..
>> >> >>
>> >> >> Voldemort...
>> >> >>
>> >> >>
>> >> >>
>> >> >>
>> >> >>
>> >> >
>> >> >
>>
>>
>>



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida