Necesito saber cuando un cálculo me da negativo y cuando positivo??

12/06/2007 - 17:06 por cmanuel83 | Informe spam
Resulta que tengo un procedimiento almacenado de selección, pero que
quiero que también me haga un cálculo y me lo devuelva en una columna
cada vez que vaya seleccionando un registro.
El cálculo lo tengo hecho mediante un CASE dentro de la sentencia
SELECT, porque no sé de qué otra forma hacerlo.
De todas formas no me está funcionando porque un CASE funciona más o
menos así:
CASE (color)
begin
when rojo then <ejecuto una acción>
when azul then <ejecuto otra accíon>
end

y mi CASE lo que hace es:
CASE (pm-(km_cc+km_sc))
begin
when negativo then pm
when positivo then pm-(km_cc+km_sc)
end
Cómo ven lo que quiero preguntar es si la resta da negativa entonces
devuelvo pm, y si da positiva entonces devuelvo la resta (pm-(km_cc
+km_sc))

El problema es que no me deja utilizar una sentencia IF en el SELECT y
por eso me he complicado.
Hasta ahora lo que no he logrado es cómo saber cuando da negativo y
cuando da positivo, para poder ejecutar la acción correcta

A continuación les adjunto el código del procedimiento:

CREATE PROCEDURE
[SP_Select_Control_Explotacion_de_Vehiculo_IDVehiculo_mes]
(
@IDVehiculo int,
@mes char(18)
)
AS
declare @Kmds int
set @Kmds = 0

SELECT
CV.dia AS Día,
CV.no_hoja_ruta AS [No. Hoja de Ruta],
SUM(CV.cant_viajes_con_carga) AS [Cant. Viajes con Carga],
SUM(CV.cant_viajes_sin_carga) AS [Cant. Viajes sin Carga],
SUM(CV.cant_viajes_con_carga + CV.cant_viajes_sin_carga) AS [Total de
Viajes],
SUM(CV.carga_transportada) AS [Carga Transportada],
SUM(CV.KM_recorridos_con_carga) AS [KM Recorridos con Carga],
SUM(CV.KM_recorridos_sin_carga) AS [KM Recorridos sin Carga],

Case(V.periodicidad_mantenimiento - ((select
sum(Km_recorridos_con_carga) from Control_Explotacion_de_Vehiculo
where Id_Vehiculo = @IDVehiculo and datepart(dy, dia) < datepart(dy,
CV.Dia))+(select sum(Km_recorridos_sin_carga) from
Control_Explotacion_de_Vehiculo where Id_Vehiculo = @IDVehiculo and
datepart(dy, dia) < datepart(dy, CV.Dia))))
when (V.periodicidad_mantenimiento + ((select
sum(Km_recorridos_con_carga) from Control_Explotacion_de_Vehiculo
where Id_Vehiculo = @IDVehiculo and datepart(dy, dia) < datepart(dy,
CV.Dia))+(select sum(Km_recorridos_sin_carga) from
Control_Explotacion_de_Vehiculo where Id_Vehiculo = @IDVehiculo and
datepart(dy, dia) < datepart(dy, CV.Dia)))) then
V.periodicidad_mantenimiento
when (V.periodicidad_mantenimiento - ((select
sum(Km_recorridos_con_carga) from Control_Explotacion_de_Vehiculo
where Id_Vehiculo = @IDVehiculo and datepart(dy, dia) < datepart(dy,
CV.Dia))+(select sum(Km_recorridos_sin_carga) from
Control_Explotacion_de_Vehiculo where Id_Vehiculo = @IDVehiculo and
datepart(dy, dia) < datepart(dy, CV.Dia)))) then
(V.periodicidad_mantenimiento - ((select sum(Km_recorridos_con_carga)
from Control_Explotacion_de_Vehiculo where Id_Vehiculo = @IDVehiculo
and datepart(dy, dia) < datepart(dy, CV.Dia))+(select
sum(Km_recorridos_sin_carga) from Control_Explotacion_de_Vehiculo
where Id_Vehiculo = @IDVehiculo and datepart(dy, dia) < datepart(dy,
CV.Dia))))
end,
CV.horas_serv_movimiento AS [Horas Serv. Movimiento],
CV.horas_serv_parado AS [Horas Serv. Parado],
SUM(CV.cant_combustible) AS [Cant. Combustible],
CV.tarjeta_combustible AS [Tarjeta Combustible],
SUM(CV.cant_aceite) AS [Cant. de Aceite]
FROM
Control_Explotacion_de_Vehiculo as [CV]
INNER Join
[Vehículo] as [V]
ON
(CV.ID_vehiculo = @IDVehiculo) AND (mes = @mes)
AND
V.Id_Vehiculo = CV.Id_Vehiculo
GROUP BY
CV.dia, CV.no_hoja_ruta, CV.tarjeta_combustible,
CV.horas_serv_movimiento, CV.horas_serv_parado ,
V.periodicidad_mantenimiento
GO

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
12/06/2007 - 17:31 | Informe spam
,

Puedes usar la funcion SIGN().

CASE
when sign((pm-(km_cc+km_sc))) = -1 then pm
else pm-(km_cc+km_sc)
end


AMB


"" wrote:

Resulta que tengo un procedimiento almacenado de selección, pero que
quiero que también me haga un cálculo y me lo devuelva en una columna
cada vez que vaya seleccionando un registro.
El cálculo lo tengo hecho mediante un CASE dentro de la sentencia
SELECT, porque no sé de qué otra forma hacerlo.
De todas formas no me está funcionando porque un CASE funciona más o
menos así:
CASE (color)
begin
when rojo then <ejecuto una acción>
when azul then <ejecuto otra accíon>
end

y mi CASE lo que hace es:
CASE (pm-(km_cc+km_sc))
begin
when negativo then pm
when positivo then pm-(km_cc+km_sc)
end
Cómo ven lo que quiero preguntar es si la resta da negativa entonces
devuelvo pm, y si da positiva entonces devuelvo la resta (pm-(km_cc
+km_sc))

El problema es que no me deja utilizar una sentencia IF en el SELECT y
por eso me he complicado.
Hasta ahora lo que no he logrado es cómo saber cuando da negativo y
cuando da positivo, para poder ejecutar la acción correcta

A continuación les adjunto el código del procedimiento:

CREATE PROCEDURE
[SP_Select_Control_Explotacion_de_Vehiculo_IDVehiculo_mes]
(
@IDVehiculo int,
@mes char(18)
)
AS
declare @Kmds int
set @Kmds = 0

SELECT
CV.dia AS Día,
CV.no_hoja_ruta AS [No. Hoja de Ruta],
SUM(CV.cant_viajes_con_carga) AS [Cant. Viajes con Carga],
SUM(CV.cant_viajes_sin_carga) AS [Cant. Viajes sin Carga],
SUM(CV.cant_viajes_con_carga + CV.cant_viajes_sin_carga) AS [Total de
Viajes],
SUM(CV.carga_transportada) AS [Carga Transportada],
SUM(CV.KM_recorridos_con_carga) AS [KM Recorridos con Carga],
SUM(CV.KM_recorridos_sin_carga) AS [KM Recorridos sin Carga],

Case(V.periodicidad_mantenimiento - ((select
sum(Km_recorridos_con_carga) from Control_Explotacion_de_Vehiculo
where Id_Vehiculo = @IDVehiculo and datepart(dy, dia) < datepart(dy,
CV.Dia))+(select sum(Km_recorridos_sin_carga) from
Control_Explotacion_de_Vehiculo where Id_Vehiculo = @IDVehiculo and
datepart(dy, dia) < datepart(dy, CV.Dia))))
when (V.periodicidad_mantenimiento + ((select
sum(Km_recorridos_con_carga) from Control_Explotacion_de_Vehiculo
where Id_Vehiculo = @IDVehiculo and datepart(dy, dia) < datepart(dy,
CV.Dia))+(select sum(Km_recorridos_sin_carga) from
Control_Explotacion_de_Vehiculo where Id_Vehiculo = @IDVehiculo and
datepart(dy, dia) < datepart(dy, CV.Dia)))) then
V.periodicidad_mantenimiento
when (V.periodicidad_mantenimiento - ((select
sum(Km_recorridos_con_carga) from Control_Explotacion_de_Vehiculo
where Id_Vehiculo = @IDVehiculo and datepart(dy, dia) < datepart(dy,
CV.Dia))+(select sum(Km_recorridos_sin_carga) from
Control_Explotacion_de_Vehiculo where Id_Vehiculo = @IDVehiculo and
datepart(dy, dia) < datepart(dy, CV.Dia)))) then
(V.periodicidad_mantenimiento - ((select sum(Km_recorridos_con_carga)
from Control_Explotacion_de_Vehiculo where Id_Vehiculo = @IDVehiculo
and datepart(dy, dia) < datepart(dy, CV.Dia))+(select
sum(Km_recorridos_sin_carga) from Control_Explotacion_de_Vehiculo
where Id_Vehiculo = @IDVehiculo and datepart(dy, dia) < datepart(dy,
CV.Dia))))
end,
CV.horas_serv_movimiento AS [Horas Serv. Movimiento],
CV.horas_serv_parado AS [Horas Serv. Parado],
SUM(CV.cant_combustible) AS [Cant. Combustible],
CV.tarjeta_combustible AS [Tarjeta Combustible],
SUM(CV.cant_aceite) AS [Cant. de Aceite]
FROM
Control_Explotacion_de_Vehiculo as [CV]
INNER Join
[Vehículo] as [V]
ON
(CV.ID_vehiculo = @IDVehiculo) AND (mes = @mes)
AND
V.Id_Vehiculo = CV.Id_Vehiculo
GROUP BY
CV.dia, CV.no_hoja_ruta, CV.tarjeta_combustible,
CV.horas_serv_movimiento, CV.horas_serv_parado ,
V.periodicidad_mantenimiento
GO


Respuesta Responder a este mensaje
#2 Federico A Colli
12/06/2007 - 20:49 | Informe spam
Perdon, por eficiencia no es más optimo verificar que el resultado sea menor
a cero?

CASE
when (pm-(km_cc+km_sc)) < 0 then pm
else pm-(km_cc+km_sc)
end

Carpe diem, tempus fugit.
El hombre sabio no da las respuestas correctas, propone las preguntas
correctas (Claude Levi-Strauss).
La sabiduría no es un producto de la educación sino de toda una vida por
adquirirla (Albert Einstein).
El sabio puede sentarse en un hormiguero, pero sólo el necio se queda
sentado en él (Proverbio chino).

AUS Federico A. Colli


"Alejandro Mesa" escribió en el
mensaje news:
,

Puedes usar la funcion SIGN().

CASE
when sign((pm-(km_cc+km_sc))) = -1 then pm
else pm-(km_cc+km_sc)
end


AMB


"" wrote:

Resulta que tengo un procedimiento almacenado de selección, pero que
quiero que también me haga un cálculo y me lo devuelva en una columna
cada vez que vaya seleccionando un registro.
El cálculo lo tengo hecho mediante un CASE dentro de la sentencia
SELECT, porque no sé de qué otra forma hacerlo.
De todas formas no me está funcionando porque un CASE funciona más o
menos así:
CASE (color)
begin
when rojo then <ejecuto una acción>
when azul then <ejecuto otra accíon>
end

y mi CASE lo que hace es:
CASE (pm-(km_cc+km_sc))
begin
when negativo then pm
when positivo then pm-(km_cc+km_sc)
end
Cómo ven lo que quiero preguntar es si la resta da negativa entonces
devuelvo pm, y si da positiva entonces devuelvo la resta (pm-(km_cc
+km_sc))

El problema es que no me deja utilizar una sentencia IF en el SELECT y
por eso me he complicado.
Hasta ahora lo que no he logrado es cómo saber cuando da negativo y
cuando da positivo, para poder ejecutar la acción correcta

A continuación les adjunto el código del procedimiento:

CREATE PROCEDURE
[SP_Select_Control_Explotacion_de_Vehiculo_IDVehiculo_mes]
(
@IDVehiculo int,
@mes char(18)
)
AS
declare @Kmds int
set @Kmds = 0

SELECT
CV.dia AS Día,
CV.no_hoja_ruta AS [No. Hoja de Ruta],
SUM(CV.cant_viajes_con_carga) AS [Cant. Viajes con Carga],
SUM(CV.cant_viajes_sin_carga) AS [Cant. Viajes sin Carga],
SUM(CV.cant_viajes_con_carga + CV.cant_viajes_sin_carga) AS [Total de
Viajes],
SUM(CV.carga_transportada) AS [Carga Transportada],
SUM(CV.KM_recorridos_con_carga) AS [KM Recorridos con Carga],
SUM(CV.KM_recorridos_sin_carga) AS [KM Recorridos sin Carga],

Case(V.periodicidad_mantenimiento - ((select
sum(Km_recorridos_con_carga) from Control_Explotacion_de_Vehiculo
where Id_Vehiculo = @IDVehiculo and datepart(dy, dia) < datepart(dy,
CV.Dia))+(select sum(Km_recorridos_sin_carga) from
Control_Explotacion_de_Vehiculo where Id_Vehiculo = @IDVehiculo and
datepart(dy, dia) < datepart(dy, CV.Dia))))
when (V.periodicidad_mantenimiento + ((select
sum(Km_recorridos_con_carga) from Control_Explotacion_de_Vehiculo
where Id_Vehiculo = @IDVehiculo and datepart(dy, dia) < datepart(dy,
CV.Dia))+(select sum(Km_recorridos_sin_carga) from
Control_Explotacion_de_Vehiculo where Id_Vehiculo = @IDVehiculo and
datepart(dy, dia) < datepart(dy, CV.Dia)))) then
V.periodicidad_mantenimiento
when (V.periodicidad_mantenimiento - ((select
sum(Km_recorridos_con_carga) from Control_Explotacion_de_Vehiculo
where Id_Vehiculo = @IDVehiculo and datepart(dy, dia) < datepart(dy,
CV.Dia))+(select sum(Km_recorridos_sin_carga) from
Control_Explotacion_de_Vehiculo where Id_Vehiculo = @IDVehiculo and
datepart(dy, dia) < datepart(dy, CV.Dia)))) then
(V.periodicidad_mantenimiento - ((select sum(Km_recorridos_con_carga)
from Control_Explotacion_de_Vehiculo where Id_Vehiculo = @IDVehiculo
and datepart(dy, dia) < datepart(dy, CV.Dia))+(select
sum(Km_recorridos_sin_carga) from Control_Explotacion_de_Vehiculo
where Id_Vehiculo = @IDVehiculo and datepart(dy, dia) < datepart(dy,
CV.Dia))))
end,
CV.horas_serv_movimiento AS [Horas Serv. Movimiento],
CV.horas_serv_parado AS [Horas Serv. Parado],
SUM(CV.cant_combustible) AS [Cant. Combustible],
CV.tarjeta_combustible AS [Tarjeta Combustible],
SUM(CV.cant_aceite) AS [Cant. de Aceite]
FROM
Control_Explotacion_de_Vehiculo as [CV]
INNER Join
[Vehículo] as [V]
ON
(CV.ID_vehiculo = @IDVehiculo) AND (mes = @mes)
AND
V.Id_Vehiculo = CV.Id_Vehiculo
GROUP BY
CV.dia, CV.no_hoja_ruta, CV.tarjeta_combustible,
CV.horas_serv_movimiento, CV.horas_serv_parado ,
V.periodicidad_mantenimiento
GO





Respuesta Responder a este mensaje
#3 Alejandro Mesa
12/06/2007 - 22:48 | Informe spam
Hola Federicoi,

Yo no se si sera mas eficiente lo que propones, pero si es mas leible. Me
pregunto en que habre estado pensando cuando propuse el uso de la funcion
SIGN, cuando la comparacion es mas leible, sencilla y hasta seguro mas
eficiente.

Gracias,

AMB

"Federico A Colli" wrote:

Perdon, por eficiencia no es más optimo verificar que el resultado sea menor
a cero?

CASE
when (pm-(km_cc+km_sc)) < 0 then pm
else pm-(km_cc+km_sc)
end

Carpe diem, tempus fugit.
El hombre sabio no da las respuestas correctas, propone las preguntas
correctas (Claude Levi-Strauss).
La sabiduría no es un producto de la educación sino de toda una vida por
adquirirla (Albert Einstein).
El sabio puede sentarse en un hormiguero, pero sólo el necio se queda
sentado en él (Proverbio chino).

AUS Federico A. Colli


"Alejandro Mesa" escribió en el
mensaje news:
> ,
>
> Puedes usar la funcion SIGN().
>
> CASE
> when sign((pm-(km_cc+km_sc))) = -1 then pm
> else pm-(km_cc+km_sc)
> end
>
>
> AMB
>
>
> "" wrote:
>
>> Resulta que tengo un procedimiento almacenado de selección, pero que
>> quiero que también me haga un cálculo y me lo devuelva en una columna
>> cada vez que vaya seleccionando un registro.
>> El cálculo lo tengo hecho mediante un CASE dentro de la sentencia
>> SELECT, porque no sé de qué otra forma hacerlo.
>> De todas formas no me está funcionando porque un CASE funciona más o
>> menos así:
>> CASE (color)
>> begin
>> when rojo then <ejecuto una acción>
>> when azul then <ejecuto otra accíon>
>> end
>>
>> y mi CASE lo que hace es:
>> CASE (pm-(km_cc+km_sc))
>> begin
>> when negativo then pm
>> when positivo then pm-(km_cc+km_sc)
>> end
>> Cómo ven lo que quiero preguntar es si la resta da negativa entonces
>> devuelvo pm, y si da positiva entonces devuelvo la resta (pm-(km_cc
>> +km_sc))
>>
>> El problema es que no me deja utilizar una sentencia IF en el SELECT y
>> por eso me he complicado.
>> Hasta ahora lo que no he logrado es cómo saber cuando da negativo y
>> cuando da positivo, para poder ejecutar la acción correcta
>>
>> A continuación les adjunto el código del procedimiento:
>>
>> CREATE PROCEDURE
>> [SP_Select_Control_Explotacion_de_Vehiculo_IDVehiculo_mes]
>> (
>> @IDVehiculo int,
>> @mes char(18)
>> )
>> AS
>> declare @Kmds int
>> set @Kmds = 0
>>
>> SELECT
>> CV.dia AS Día,
>> CV.no_hoja_ruta AS [No. Hoja de Ruta],
>> SUM(CV.cant_viajes_con_carga) AS [Cant. Viajes con Carga],
>> SUM(CV.cant_viajes_sin_carga) AS [Cant. Viajes sin Carga],
>> SUM(CV.cant_viajes_con_carga + CV.cant_viajes_sin_carga) AS [Total de
>> Viajes],
>> SUM(CV.carga_transportada) AS [Carga Transportada],
>> SUM(CV.KM_recorridos_con_carga) AS [KM Recorridos con Carga],
>> SUM(CV.KM_recorridos_sin_carga) AS [KM Recorridos sin Carga],
>>
>> Case(V.periodicidad_mantenimiento - ((select
>> sum(Km_recorridos_con_carga) from Control_Explotacion_de_Vehiculo
>> where Id_Vehiculo = @IDVehiculo and datepart(dy, dia) < datepart(dy,
>> CV.Dia))+(select sum(Km_recorridos_sin_carga) from
>> Control_Explotacion_de_Vehiculo where Id_Vehiculo = @IDVehiculo and
>> datepart(dy, dia) < datepart(dy, CV.Dia))))
>> when (V.periodicidad_mantenimiento + ((select
>> sum(Km_recorridos_con_carga) from Control_Explotacion_de_Vehiculo
>> where Id_Vehiculo = @IDVehiculo and datepart(dy, dia) < datepart(dy,
>> CV.Dia))+(select sum(Km_recorridos_sin_carga) from
>> Control_Explotacion_de_Vehiculo where Id_Vehiculo = @IDVehiculo and
>> datepart(dy, dia) < datepart(dy, CV.Dia)))) then
>> V.periodicidad_mantenimiento
>> when (V.periodicidad_mantenimiento - ((select
>> sum(Km_recorridos_con_carga) from Control_Explotacion_de_Vehiculo
>> where Id_Vehiculo = @IDVehiculo and datepart(dy, dia) < datepart(dy,
>> CV.Dia))+(select sum(Km_recorridos_sin_carga) from
>> Control_Explotacion_de_Vehiculo where Id_Vehiculo = @IDVehiculo and
>> datepart(dy, dia) < datepart(dy, CV.Dia)))) then
>> (V.periodicidad_mantenimiento - ((select sum(Km_recorridos_con_carga)
>> from Control_Explotacion_de_Vehiculo where Id_Vehiculo = @IDVehiculo
>> and datepart(dy, dia) < datepart(dy, CV.Dia))+(select
>> sum(Km_recorridos_sin_carga) from Control_Explotacion_de_Vehiculo
>> where Id_Vehiculo = @IDVehiculo and datepart(dy, dia) < datepart(dy,
>> CV.Dia))))
>> end,
>> CV.horas_serv_movimiento AS [Horas Serv. Movimiento],
>> CV.horas_serv_parado AS [Horas Serv. Parado],
>> SUM(CV.cant_combustible) AS [Cant. Combustible],
>> CV.tarjeta_combustible AS [Tarjeta Combustible],
>> SUM(CV.cant_aceite) AS [Cant. de Aceite]
>> FROM
>> Control_Explotacion_de_Vehiculo as [CV]
>> INNER Join
>> [Vehículo] as [V]
>> ON
>> (CV.ID_vehiculo = @IDVehiculo) AND (mes = @mes)
>> AND
>> V.Id_Vehiculo = CV.Id_Vehiculo
>> GROUP BY
>> CV.dia, CV.no_hoja_ruta, CV.tarjeta_combustible,
>> CV.horas_serv_movimiento, CV.horas_serv_parado ,
>> V.periodicidad_mantenimiento
>> GO
>>
>>
>



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