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
 

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


Preguntas similares