uso del Case en parte Where de un select

12/01/2006 - 08:19 por Juan Carlos | Informe spam
Hola lista, quizas lo que vaya a preguntar no se pueda hacer.

Tengo el siguiente query original:

Alter Procedure SALDSS_SaldosPorRangosdeFechas --
SALDSS_SaldosPorRangosdeFechas '00', '001', '211', Null, '2005/08/01',
'2005/09/01', Null, 'T', 0, Null, Null, Null, 'Che', 'Color', 0
@SUCR_Codigo Char(2), @ALMA_Codigo Char(3), @FAMI_Codigo Char(4),
@SUBF_Codigo Char(5), @SALD_FechaI Datetime, @SALD_FechaF Datetime,
@MARC_Codigo Char(3), @PROD_Tipo Char(1), @UnidadMedida SmallInt,
@PROD_ClaseABC Char(1), @PROD_Desc_Contiene1 Varchar(80) = Null,
@PROD_Desc_Contiene2 Varchar(80) = Null, @PROD_Desc_NoContiene1 Varchar(80)
= Null, @PROD_Desc_NoContiene2 Varchar(80) = Null
As
Set NoCount On
Declare @SALD_FecSaldoI Char(10), @SALD_FecSaldoF Char(10), @SALD_FechaIM
Datetime
Select @SALD_FechaIM = @SALD_FechaI + 1
Select @SALD_FecSaldoI = Convert(Char(10), @SALD_FechaI, 102) ,
@SALD_FecSaldoF = Convert(Char(10), @SALD_FechaF, 102)
Create Table #TmpSaldosT (SUCR_Codigo Char(2), ALMA_Codigo Char(3),
SALD_FecSaldo Char(10), PROD_CodProd Char(15), SALD_SaldoPFI Decimal(14,4)
Constraint [Pk_TmpSaldosT_SALDSS_SaldosProRangosdeFechas] Primary Key
Clustered (SUCR_Codigo, ALMA_Codigo, SALD_FecSaldo, PROD_CodProd) With
FillFactor = 90 On [Primary])
Create Table #TmpSaldosR (SUCR_Codigo Char(2), ALMA_Codigo Char(3),
PROD_CodProd Char(15), SALD_SaldoPFI Decimal(14,4), SALD_Ingresos
Decimal(14,4), SALD_Salidas Decimal(14,4), SALD_SaldoPFF Decimal(14,4)
Constraint [Pk_TmpSaldosR_SALDSS_SaldosProRangosdeFechas] Primary Key
Clustered (SUCR_Codigo, ALMA_Codigo, PROD_CodProd) With FillFactor = 90 On
[Primary])
Insert Into #TmpSaldosR
Select C.SUCR_Codigo, C.ALMA_Codigo, C.PROD_CodProd, 0, 0, 0, 0
From Productos P Inner Join Catalogos C On P.PROD_CodProd = C.PROD_CodProd
Where C.SUCR_Codigo = @SUCR_Codigo And C.ALMA_Codigo = @ALMA_Codigo And
C.CATL_Activo = 'S'
And P.FAMI_Codigo = IsNull(@FAMI_Codigo, P.FAMI_Codigo) And P.SUBF_Codigo =
IsNull(@SUBF_Codigo, P.SUBF_Codigo)
And P.MARC_Codigo = IsNull(@MARC_Codigo, P.MARC_Codigo) And P.PROD_Tipo =
IsNull(@PROD_Tipo, P.PROD_Tipo)
And P.PROD_ClaseABC = IsNull(@PROD_ClaseABC, P.PROD_ClaseABC)
And P.PROD_Desc Like '%' + dbo.Alltrim(IsNull(@PROD_Desc_Contiene1,
P.PROD_Desc)) + '%' And P.PROD_Desc Like '%' +
dbo.Alltrim(IsNull(@PROD_Desc_Contiene2, P.PROD_Desc)) + '%'
And P.PROD_Desc Not Like dbo.Alltrim(IsNull('%' + @PROD_Desc_NoContiene1 +
'%', '')) And P.PROD_Desc Not Like dbo.Alltrim(IsNull('%' +
@PROD_Desc_NoContiene2 + '%', ''))
Insert Into #TmpSaldosT
Select S.SUCR_Codigo, S.ALMA_Codigo, Max(S.SALD_FecSaldo) As SALD_FecSaldo,
S.PROD_CodProd, Convert(decimal(14,4), 0) As SALD_SaldoPFI
From Saldos S Inner Join #TmpSaldosR P On S.SUCR_Codigo = P.SUCR_Codigo And
S.ALMA_Codigo = P.ALMA_Codigo And S.PROD_CodProd = P.PROD_CodProd
Where S.SALD_FecSaldo <= @SALD_FecSaldoI
Group by S.SUCR_Codigo, S.ALMA_Codigo, S.PROD_CodProd
Update #TmpSaldosT Set SALD_SaldoPFI = S.SALD_SaldoF
From #TmpSaldosT T Inner Join Saldos S On T.SUCR_Codigo = S.SUCR_Codigo And
T.ALMA_Codigo = S.ALMA_Codigo And T.SALD_FecSaldo = S.SALD_FecSaldo And
T.PROD_CodProd = S.PROD_CodProd
Update #TmpSaldosR Set SALD_SaldoPFI = S.SALD_SaldoPFI
From #TmpSaldosR T Inner Join #TmpSaldosT S On T.SUCR_Codigo = S.SUCR_Codigo
And T.ALMA_Codigo = S.ALMA_Codigo And T.PROD_CodProd = S.PROD_CodProd
Delete From #TmpSaldosT
Insert Into #TmpSaldosT
Select D.SUCR_Codigo, D.ALMA_Codigo, Convert(SmallDateTime, Getdate()),
D.PROD_CodProd, Sum(D.DVAL_CantIngr) As DVAL_CantIngr From DetValesAlm D
Inner Join Vales V On D.SUCR_Codigo = V.SUCR_Codigo And D.ALMA_Codigo =
V.ALMA_Codigo And D.TIPO_TabVale = V.TIPO_TabVale And D.TIPO_CodVale =
V.TIPO_CodVale And D.VALE_NumVale = V.VALE_NumVale
Inner Join #TmpSaldosR P On P.SUCR_Codigo = D.SUCR_Codigo And P.ALMA_Codigo
= D.ALMA_Codigo And P.PROD_CodProd = D.PROD_CodProd
Where V.VALE_Estado = 'C' And D.DVAL_FecConfir Between @SALD_FechaIM And
@SALD_FechaF And V.VALE_Efecto = 'I'
Group By D.SUCR_Codigo, D.ALMA_Codigo, D.PROD_CodProd
Update #TmpSaldosR Set SALD_Ingresos = S.SALD_SaldoPFI
From #TmpSaldosR T Inner Join #TmpSaldosT S On T.SUCR_Codigo = S.SUCR_Codigo
And T.ALMA_Codigo = S.ALMA_Codigo And T.PROD_CodProd = S.PROD_CodProd
Delete From #TmpSaldosT
Insert Into #TmpSaldosT
Select D.SUCR_Codigo, D.ALMA_Codigo, Convert(SmallDateTime, Getdate()),
D.PROD_CodProd, Sum(D.DVAL_CantSalida) DVAL_CantSalida From DetValesAlm D
Inner Join Vales V On D.SUCR_Codigo = V.SUCR_Codigo And D.ALMA_Codigo =
V.ALMA_Codigo And D.TIPO_TabVale = V.TIPO_TabVale And D.TIPO_CodVale =
V.TIPO_CodVale And D.VALE_NumVale = V.VALE_NumVale
Inner Join #TmpSaldosR P On P.SUCR_Codigo = D.SUCR_Codigo And P.ALMA_Codigo
= D.ALMA_Codigo And P.PROD_CodProd = D.PROD_CodProd
Where V.VALE_Estado = 'C' And D.DVAL_FecConfir Between @SALD_FechaIM And
@SALD_FechaF And V.VALE_Efecto = 'S'
Group By D.SUCR_Codigo, D.ALMA_Codigo, D.PROD_CodProd
Update #TmpSaldosR Set SALD_Salidas = S.SALD_SaldoPFI
From #TmpSaldosR T Inner Join #TmpSaldosT S On T.SUCR_Codigo = S.SUCR_Codigo
And T.ALMA_Codigo = S.ALMA_Codigo And T.PROD_CodProd = S.PROD_CodProd
Delete From #TmpSaldosT
Insert Into #TmpSaldosT
Select S.SUCR_Codigo, S.ALMA_Codigo, Max(S.SALD_FecSaldo) As SALD_FecSaldo,
S.PROD_CodProd, Convert(decimal(14,4), 0) As SALD_SaldoPFF
From Saldos S Inner Join #TmpSaldosR P On P.SUCR_Codigo = S.SUCR_Codigo And
P.ALMA_Codigo = S.ALMA_Codigo And P.PROD_CodProd = S.PROD_CodProd
Where S.SALD_FecSaldo <= @SALD_FecSaldoF
Group by S.SUCR_Codigo, S.ALMA_Codigo, S.PROD_CodProd
Update #TmpSaldosT Set SALD_SaldoPFI = S.SALD_SaldoF
From #TmpSaldosT T Inner Join Saldos S On T.SUCR_Codigo = S.SUCR_Codigo And
T.ALMA_Codigo = S.ALMA_Codigo And T.SALD_FecSaldo = S.SALD_FecSaldo And
T.PROD_CodProd = S.PROD_CodProd
Update #TmpSaldosR Set SALD_SaldoPFF = S.SALD_SaldoPFI
From #TmpSaldosR T Inner Join #TmpSaldosT S On T.SUCR_Codigo = S.SUCR_Codigo
And T.ALMA_Codigo = S.ALMA_Codigo And T.PROD_CodProd = S.PROD_CodProd
Drop Table #TmpSaldosT
Select P.PROD_CodigoAnt, S.PROD_CodProd, P.PROD_Desc, M.MARC_Descripcion,
T.TIPO_DescC,
Case @UnidadMedida When 0 Then S.SALD_SaldoPFI When 1 Then S.SALD_SaldoPFI
/ P.PROD_Factor End As SALD_SaldoPFI,
Case @UnidadMedida When 0 Then S.SALD_Ingresos When 1 Then S.SALD_Ingresos
/ P.PROD_Factor End As SALD_Ingresos,
Case @UnidadMedida When 0 Then S.SALD_Salidas When 1 Then S.SALD_Salidas /
P.PROD_Factor End As SALD_Salidas,
Case @UnidadMedida When 0 Then S.SALD_SaldoPFF When 1 Then S.SALD_SaldoPFF
/ P.PROD_Factor End As SALD_SaldoPFF,
dbo.Alltrim(U.UBIC_Codigo) + dbo.Alltrim(U.UBIC_Desc) As UBIC_Desc,
P.PROD_ClaseABC, F.FAMI_Codigo, F.FAMI_Desc1, SF.SUBF_Codigo, SF.SUBF_Desc1
From #TmpSaldosR S
Inner Join Productos P On S.PROD_CodProd = P.PROD_CodProd
Inner Join Tipos T On T.TIPO_CodTabla = P.TIPO_TabMed And T.TIPO_CodTipo =
Case @UnidadMedida When 0 Then P.TIPO_CodMedV When 1 Then P.TIPO_CodMedC End
Inner Join Marcas M On M.MARC_Codigo = P.MARC_Codigo
Inner Join Familias F On F.FAMI_Codigo = P.FAMI_Codigo
Inner Join Subfamilias SF On SF.SUBF_Codigo = P.SUBF_Codigo And
SF.FAMI_Codigo = P.FAMI_Codigo
Inner Join Catalogos C On S.SUCR_Codigo = C.SUCR_Codigo And S.ALMA_Codigo =
C.ALMA_Codigo And S.PROD_CodProd = C.PROD_CodProd
Left Join Ubicaciones U On U.ALMA_Codigo = C.ALMA_Codigo And U.UBIC_Codigo
= C.UBIC_Codigo
Order by S.PROD_CodProd
Drop Table #TmpSaldosR
Set NoCount Off

y lo que deseo es que con un parametro adicional me filter solo los datos
que tienen resultado es decir sean diferentes de 0 en el campo
S.SALD_SaldoPFF, entonces pense en hacer en esto y bueno no me funciona ya
que no lo compila el query analizer, le aumente la clausula WHERE al final
donde practicamente muestro los datos.

Alter Procedure SALDSS_SaldosPorRangosdeFechas --
SALDSS_SaldosPorRangosdeFechas '00', '001', '211', Null, '2005/08/01',
'2005/09/01', Null, 'T', 0, Null, Null, Null, 'Che', 'Color', 0
@SUCR_Codigo Char(2), @ALMA_Codigo Char(3), @FAMI_Codigo Char(4),
@SUBF_Codigo Char(5), @SALD_FechaI Datetime, @SALD_FechaF Datetime,
@MARC_Codigo Char(3), @PROD_Tipo Char(1), @UnidadMedida SmallInt,
@PROD_ClaseABC Char(1), @PROD_Desc_Contiene1 Varchar(80) = Null,
@PROD_Desc_Contiene2 Varchar(80) = Null, @PROD_Desc_NoContiene1 Varchar(80)
= Null, @PROD_Desc_NoContiene2 Varchar(80) = Null,
@SALD_ConSaldo Bit
As
Set NoCount On
Declare @SALD_FecSaldoI Char(10), @SALD_FecSaldoF Char(10), @SALD_FechaIM
Datetime
Select @SALD_FechaIM = @SALD_FechaI + 1
Select @SALD_FecSaldoI = Convert(Char(10), @SALD_FechaI, 102) ,
@SALD_FecSaldoF = Convert(Char(10), @SALD_FechaF, 102)
Create Table #TmpSaldosT (SUCR_Codigo Char(2), ALMA_Codigo Char(3),
SALD_FecSaldo Char(10), PROD_CodProd Char(15), SALD_SaldoPFI Decimal(14,4)
Constraint [Pk_TmpSaldosT_SALDSS_SaldosProRangosdeFechas] Primary Key
Clustered (SUCR_Codigo, ALMA_Codigo, SALD_FecSaldo, PROD_CodProd) With
FillFactor = 90 On [Primary])
Create Table #TmpSaldosR (SUCR_Codigo Char(2), ALMA_Codigo Char(3),
PROD_CodProd Char(15), SALD_SaldoPFI Decimal(14,4), SALD_Ingresos
Decimal(14,4), SALD_Salidas Decimal(14,4), SALD_SaldoPFF Decimal(14,4)
Constraint [Pk_TmpSaldosR_SALDSS_SaldosProRangosdeFechas] Primary Key
Clustered (SUCR_Codigo, ALMA_Codigo, PROD_CodProd) With FillFactor = 90 On
[Primary])
Insert Into #TmpSaldosR
Select C.SUCR_Codigo, C.ALMA_Codigo, C.PROD_CodProd, 0, 0, 0, 0
From Productos P Inner Join Catalogos C On P.PROD_CodProd = C.PROD_CodProd
Where C.SUCR_Codigo = @SUCR_Codigo And C.ALMA_Codigo = @ALMA_Codigo And
C.CATL_Activo = 'S'
And P.FAMI_Codigo = IsNull(@FAMI_Codigo, P.FAMI_Codigo) And P.SUBF_Codigo =
IsNull(@SUBF_Codigo, P.SUBF_Codigo)
And P.MARC_Codigo = IsNull(@MARC_Codigo, P.MARC_Codigo) And P.PROD_Tipo =
IsNull(@PROD_Tipo, P.PROD_Tipo)
And P.PROD_ClaseABC = IsNull(@PROD_ClaseABC, P.PROD_ClaseABC)
And P.PROD_Desc Like '%' + dbo.Alltrim(IsNull(@PROD_Desc_Contiene1,
P.PROD_Desc)) + '%' And P.PROD_Desc Like '%' +
dbo.Alltrim(IsNull(@PROD_Desc_Contiene2, P.PROD_Desc)) + '%'
And P.PROD_Desc Not Like dbo.Alltrim(IsNull('%' + @PROD_Desc_NoContiene1 +
'%', '')) And P.PROD_Desc Not Like dbo.Alltrim(IsNull('%' +
@PROD_Desc_NoContiene2 + '%', ''))
Insert Into #TmpSaldosT
Select S.SUCR_Codigo, S.ALMA_Codigo, Max(S.SALD_FecSaldo) As SALD_FecSaldo,
S.PROD_CodProd, Convert(decimal(14,4), 0) As SALD_SaldoPFI
From Saldos S Inner Join #TmpSaldosR P On S.SUCR_Codigo = P.SUCR_Codigo And
S.ALMA_Codigo = P.ALMA_Codigo And S.PROD_CodProd = P.PROD_CodProd
Where S.SALD_FecSaldo <= @SALD_FecSaldoI
Group by S.SUCR_Codigo, S.ALMA_Codigo, S.PROD_CodProd
Update #TmpSaldosT Set SALD_SaldoPFI = S.SALD_SaldoF
From #TmpSaldosT T Inner Join Saldos S On T.SUCR_Codigo = S.SUCR_Codigo And
T.ALMA_Codigo = S.ALMA_Codigo And T.SALD_FecSaldo = S.SALD_FecSaldo And
T.PROD_CodProd = S.PROD_CodProd
Update #TmpSaldosR Set SALD_SaldoPFI = S.SALD_SaldoPFI
From #TmpSaldosR T Inner Join #TmpSaldosT S On T.SUCR_Codigo = S.SUCR_Codigo
And T.ALMA_Codigo = S.ALMA_Codigo And T.PROD_CodProd = S.PROD_CodProd
Delete From #TmpSaldosT
Insert Into #TmpSaldosT
Select D.SUCR_Codigo, D.ALMA_Codigo, Convert(SmallDateTime, Getdate()),
D.PROD_CodProd, Sum(D.DVAL_CantIngr) As DVAL_CantIngr From DetValesAlm D
Inner Join Vales V On D.SUCR_Codigo = V.SUCR_Codigo And D.ALMA_Codigo =
V.ALMA_Codigo And D.TIPO_TabVale = V.TIPO_TabVale And D.TIPO_CodVale =
V.TIPO_CodVale And D.VALE_NumVale = V.VALE_NumVale
Inner Join #TmpSaldosR P On P.SUCR_Codigo = D.SUCR_Codigo And P.ALMA_Codigo
= D.ALMA_Codigo And P.PROD_CodProd = D.PROD_CodProd
Where V.VALE_Estado = 'C' And D.DVAL_FecConfir Between @SALD_FechaIM And
@SALD_FechaF And V.VALE_Efecto = 'I'
Group By D.SUCR_Codigo, D.ALMA_Codigo, D.PROD_CodProd
Update #TmpSaldosR Set SALD_Ingresos = S.SALD_SaldoPFI
From #TmpSaldosR T Inner Join #TmpSaldosT S On T.SUCR_Codigo = S.SUCR_Codigo
And T.ALMA_Codigo = S.ALMA_Codigo And T.PROD_CodProd = S.PROD_CodProd
Delete From #TmpSaldosT
Insert Into #TmpSaldosT
Select D.SUCR_Codigo, D.ALMA_Codigo, Convert(SmallDateTime, Getdate()),
D.PROD_CodProd, Sum(D.DVAL_CantSalida) DVAL_CantSalida From DetValesAlm D
Inner Join Vales V On D.SUCR_Codigo = V.SUCR_Codigo And D.ALMA_Codigo =
V.ALMA_Codigo And D.TIPO_TabVale = V.TIPO_TabVale And D.TIPO_CodVale =
V.TIPO_CodVale And D.VALE_NumVale = V.VALE_NumVale
Inner Join #TmpSaldosR P On P.SUCR_Codigo = D.SUCR_Codigo And P.ALMA_Codigo
= D.ALMA_Codigo And P.PROD_CodProd = D.PROD_CodProd
Where V.VALE_Estado = 'C' And D.DVAL_FecConfir Between @SALD_FechaIM And
@SALD_FechaF And V.VALE_Efecto = 'S'
Group By D.SUCR_Codigo, D.ALMA_Codigo, D.PROD_CodProd
Update #TmpSaldosR Set SALD_Salidas = S.SALD_SaldoPFI
From #TmpSaldosR T Inner Join #TmpSaldosT S On T.SUCR_Codigo = S.SUCR_Codigo
And T.ALMA_Codigo = S.ALMA_Codigo And T.PROD_CodProd = S.PROD_CodProd
Delete From #TmpSaldosT
Insert Into #TmpSaldosT
Select S.SUCR_Codigo, S.ALMA_Codigo, Max(S.SALD_FecSaldo) As SALD_FecSaldo,
S.PROD_CodProd, Convert(decimal(14,4), 0) As SALD_SaldoPFF
From Saldos S Inner Join #TmpSaldosR P On P.SUCR_Codigo = S.SUCR_Codigo And
P.ALMA_Codigo = S.ALMA_Codigo And P.PROD_CodProd = S.PROD_CodProd
Where S.SALD_FecSaldo <= @SALD_FecSaldoF
Group by S.SUCR_Codigo, S.ALMA_Codigo, S.PROD_CodProd
Update #TmpSaldosT Set SALD_SaldoPFI = S.SALD_SaldoF
From #TmpSaldosT T Inner Join Saldos S On T.SUCR_Codigo = S.SUCR_Codigo And
T.ALMA_Codigo = S.ALMA_Codigo And T.SALD_FecSaldo = S.SALD_FecSaldo And
T.PROD_CodProd = S.PROD_CodProd
Update #TmpSaldosR Set SALD_SaldoPFF = S.SALD_SaldoPFI
From #TmpSaldosR T Inner Join #TmpSaldosT S On T.SUCR_Codigo = S.SUCR_Codigo
And T.ALMA_Codigo = S.ALMA_Codigo And T.PROD_CodProd = S.PROD_CodProd
Drop Table #TmpSaldosT
Select P.PROD_CodigoAnt, S.PROD_CodProd, P.PROD_Desc, M.MARC_Descripcion,
T.TIPO_DescC,
Case @UnidadMedida When 0 Then S.SALD_SaldoPFI When 1 Then S.SALD_SaldoPFI
/ P.PROD_Factor End As SALD_SaldoPFI,
Case @UnidadMedida When 0 Then S.SALD_Ingresos When 1 Then S.SALD_Ingresos
/ P.PROD_Factor End As SALD_Ingresos,
Case @UnidadMedida When 0 Then S.SALD_Salidas When 1 Then S.SALD_Salidas /
P.PROD_Factor End As SALD_Salidas,
Case @UnidadMedida When 0 Then S.SALD_SaldoPFF When 1 Then S.SALD_SaldoPFF
/ P.PROD_Factor End As SALD_SaldoPFF,
dbo.Alltrim(U.UBIC_Codigo) + dbo.Alltrim(U.UBIC_Desc) As UBIC_Desc,
P.PROD_ClaseABC, F.FAMI_Codigo, F.FAMI_Desc1, SF.SUBF_Codigo, SF.SUBF_Desc1
From #TmpSaldosR S
Inner Join Productos P On S.PROD_CodProd = P.PROD_CodProd
Inner Join Tipos T On T.TIPO_CodTabla = P.TIPO_TabMed And T.TIPO_CodTipo =
Case @UnidadMedida When 0 Then P.TIPO_CodMedV When 1 Then P.TIPO_CodMedC End
Inner Join Marcas M On M.MARC_Codigo = P.MARC_Codigo
Inner Join Familias F On F.FAMI_Codigo = P.FAMI_Codigo
Inner Join Subfamilias SF On SF.SUBF_Codigo = P.SUBF_Codigo And
SF.FAMI_Codigo = P.FAMI_Codigo
Inner Join Catalogos C On S.SUCR_Codigo = C.SUCR_Codigo And S.ALMA_Codigo =
C.ALMA_Codigo And S.PROD_CodProd = C.PROD_CodProd
Left Join Ubicaciones U On U.ALMA_Codigo = C.ALMA_Codigo And U.UBIC_Codigo
= C.UBIC_Codigo
Where (Case When @SALD_ConSaldo = 0 Then S.SALD_SaldoPFF <> 0 End)
Order by S.PROD_CodProd
Drop Table #TmpSaldosR
Set NoCount Off

Pense de que esta manera me funcionaria o es que tengo que partirlo el SP
con un IF y definir que se ejecuta.

Salu2
 

Leer las respuestas

#1 Juan Carlos
12/01/2006 - 10:24 | Informe spam
Ok, Alejandro, una consulta adicional el que ponga el if en el sp, seria
menos el rendiemiento que tendria en lugar de tener 2 sps??

Gracias por tu respuesta.

Salu2

PD. Solo como comentario, el sp lo que me muestra el lo siguiente.

Producto - Descripcion - Marca - Unidad - Saldo Inicial (a fecha de
inicio) - Ingresos - Salidas - Saldo Final (a fecha de fin)


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

Un poco largo el sp como para dedicarle tiempo a entender lo que hace. Te
comento que la expresion "case" devuelve un valor, el cual debes comparar
contra otro valor para que la expresion logica este correcta:

Where (Case When @SALD_ConSaldo = 0 Then S.SALD_SaldoPFF <> 0 End)



where (expresion "case" que devuelve un valor) operador_logico
(valor_a_comparar)

En este caso especifico, es mas intuitivo usar un "if". Tambien puedes
crear
dos sps (te lo recomiendo), el uno para que devuelva los != a cero y el
otro
para devuelva todos. Entonces usas:

if @SALD_ConSaldo = 0
exec dbo.usp_que_devuelve_dif_a_cero
else
exec dbo.usp_que_devuelve_todos
go


AMB


"Juan Carlos" wrote:

Hola lista, quizas lo que vaya a preguntar no se pueda hacer.

Tengo el siguiente query original:

Alter Procedure SALDSS_SaldosPorRangosdeFechas --
SALDSS_SaldosPorRangosdeFechas '00', '001', '211', Null, '2005/08/01',
'2005/09/01', Null, 'T', 0, Null, Null, Null, 'Che', 'Color', 0
@SUCR_Codigo Char(2), @ALMA_Codigo Char(3), @FAMI_Codigo Char(4),
@SUBF_Codigo Char(5), @SALD_FechaI Datetime, @SALD_FechaF Datetime,
@MARC_Codigo Char(3), @PROD_Tipo Char(1), @UnidadMedida SmallInt,
@PROD_ClaseABC Char(1), @PROD_Desc_Contiene1 Varchar(80) = Null,
@PROD_Desc_Contiene2 Varchar(80) = Null, @PROD_Desc_NoContiene1
Varchar(80)
= Null, @PROD_Desc_NoContiene2 Varchar(80) = Null
As
Set NoCount On
Declare @SALD_FecSaldoI Char(10), @SALD_FecSaldoF Char(10), @SALD_FechaIM
Datetime
Select @SALD_FechaIM = @SALD_FechaI + 1
Select @SALD_FecSaldoI = Convert(Char(10), @SALD_FechaI, 102) ,
@SALD_FecSaldoF = Convert(Char(10), @SALD_FechaF, 102)
Create Table #TmpSaldosT (SUCR_Codigo Char(2), ALMA_Codigo Char(3),
SALD_FecSaldo Char(10), PROD_CodProd Char(15), SALD_SaldoPFI
Decimal(14,4)
Constraint [Pk_TmpSaldosT_SALDSS_SaldosProRangosdeFechas] Primary Key
Clustered (SUCR_Codigo, ALMA_Codigo, SALD_FecSaldo, PROD_CodProd) With
FillFactor = 90 On [Primary])
Create Table #TmpSaldosR (SUCR_Codigo Char(2), ALMA_Codigo Char(3),
PROD_CodProd Char(15), SALD_SaldoPFI Decimal(14,4), SALD_Ingresos
Decimal(14,4), SALD_Salidas Decimal(14,4), SALD_SaldoPFF Decimal(14,4)
Constraint [Pk_TmpSaldosR_SALDSS_SaldosProRangosdeFechas] Primary Key
Clustered (SUCR_Codigo, ALMA_Codigo, PROD_CodProd) With FillFactor = 90
On
[Primary])
Insert Into #TmpSaldosR
Select C.SUCR_Codigo, C.ALMA_Codigo, C.PROD_CodProd, 0, 0, 0, 0
From Productos P Inner Join Catalogos C On P.PROD_CodProd =
C.PROD_CodProd
Where C.SUCR_Codigo = @SUCR_Codigo And C.ALMA_Codigo = @ALMA_Codigo And
C.CATL_Activo = 'S'
And P.FAMI_Codigo = IsNull(@FAMI_Codigo, P.FAMI_Codigo) And
P.SUBF_Codigo >> IsNull(@SUBF_Codigo, P.SUBF_Codigo)
And P.MARC_Codigo = IsNull(@MARC_Codigo, P.MARC_Codigo) And P.PROD_Tipo
>> IsNull(@PROD_Tipo, P.PROD_Tipo)
And P.PROD_ClaseABC = IsNull(@PROD_ClaseABC, P.PROD_ClaseABC)
And P.PROD_Desc Like '%' + dbo.Alltrim(IsNull(@PROD_Desc_Contiene1,
P.PROD_Desc)) + '%' And P.PROD_Desc Like '%' +
dbo.Alltrim(IsNull(@PROD_Desc_Contiene2, P.PROD_Desc)) + '%'
And P.PROD_Desc Not Like dbo.Alltrim(IsNull('%' + @PROD_Desc_NoContiene1
+
'%', '')) And P.PROD_Desc Not Like dbo.Alltrim(IsNull('%' +
@PROD_Desc_NoContiene2 + '%', ''))
Insert Into #TmpSaldosT
Select S.SUCR_Codigo, S.ALMA_Codigo, Max(S.SALD_FecSaldo) As
SALD_FecSaldo,
S.PROD_CodProd, Convert(decimal(14,4), 0) As SALD_SaldoPFI
From Saldos S Inner Join #TmpSaldosR P On S.SUCR_Codigo = P.SUCR_Codigo
And
S.ALMA_Codigo = P.ALMA_Codigo And S.PROD_CodProd = P.PROD_CodProd
Where S.SALD_FecSaldo <= @SALD_FecSaldoI
Group by S.SUCR_Codigo, S.ALMA_Codigo, S.PROD_CodProd
Update #TmpSaldosT Set SALD_SaldoPFI = S.SALD_SaldoF
From #TmpSaldosT T Inner Join Saldos S On T.SUCR_Codigo = S.SUCR_Codigo
And
T.ALMA_Codigo = S.ALMA_Codigo And T.SALD_FecSaldo = S.SALD_FecSaldo And
T.PROD_CodProd = S.PROD_CodProd
Update #TmpSaldosR Set SALD_SaldoPFI = S.SALD_SaldoPFI
From #TmpSaldosR T Inner Join #TmpSaldosT S On T.SUCR_Codigo =
S.SUCR_Codigo
And T.ALMA_Codigo = S.ALMA_Codigo And T.PROD_CodProd = S.PROD_CodProd
Delete From #TmpSaldosT
Insert Into #TmpSaldosT
Select D.SUCR_Codigo, D.ALMA_Codigo, Convert(SmallDateTime, Getdate()),
D.PROD_CodProd, Sum(D.DVAL_CantIngr) As DVAL_CantIngr From DetValesAlm D
Inner Join Vales V On D.SUCR_Codigo = V.SUCR_Codigo And D.ALMA_Codigo >> V.ALMA_Codigo And D.TIPO_TabVale = V.TIPO_TabVale And D.TIPO_CodVale >> V.TIPO_CodVale And D.VALE_NumVale = V.VALE_NumVale
Inner Join #TmpSaldosR P On P.SUCR_Codigo = D.SUCR_Codigo And
P.ALMA_Codigo
= D.ALMA_Codigo And P.PROD_CodProd = D.PROD_CodProd
Where V.VALE_Estado = 'C' And D.DVAL_FecConfir Between @SALD_FechaIM And
@SALD_FechaF And V.VALE_Efecto = 'I'
Group By D.SUCR_Codigo, D.ALMA_Codigo, D.PROD_CodProd
Update #TmpSaldosR Set SALD_Ingresos = S.SALD_SaldoPFI
From #TmpSaldosR T Inner Join #TmpSaldosT S On T.SUCR_Codigo =
S.SUCR_Codigo
And T.ALMA_Codigo = S.ALMA_Codigo And T.PROD_CodProd = S.PROD_CodProd
Delete From #TmpSaldosT
Insert Into #TmpSaldosT
Select D.SUCR_Codigo, D.ALMA_Codigo, Convert(SmallDateTime, Getdate()),
D.PROD_CodProd, Sum(D.DVAL_CantSalida) DVAL_CantSalida From DetValesAlm D
Inner Join Vales V On D.SUCR_Codigo = V.SUCR_Codigo And D.ALMA_Codigo >> V.ALMA_Codigo And D.TIPO_TabVale = V.TIPO_TabVale And D.TIPO_CodVale >> V.TIPO_CodVale And D.VALE_NumVale = V.VALE_NumVale
Inner Join #TmpSaldosR P On P.SUCR_Codigo = D.SUCR_Codigo And
P.ALMA_Codigo
= D.ALMA_Codigo And P.PROD_CodProd = D.PROD_CodProd
Where V.VALE_Estado = 'C' And D.DVAL_FecConfir Between @SALD_FechaIM And
@SALD_FechaF And V.VALE_Efecto = 'S'
Group By D.SUCR_Codigo, D.ALMA_Codigo, D.PROD_CodProd
Update #TmpSaldosR Set SALD_Salidas = S.SALD_SaldoPFI
From #TmpSaldosR T Inner Join #TmpSaldosT S On T.SUCR_Codigo =
S.SUCR_Codigo
And T.ALMA_Codigo = S.ALMA_Codigo And T.PROD_CodProd = S.PROD_CodProd
Delete From #TmpSaldosT
Insert Into #TmpSaldosT
Select S.SUCR_Codigo, S.ALMA_Codigo, Max(S.SALD_FecSaldo) As
SALD_FecSaldo,
S.PROD_CodProd, Convert(decimal(14,4), 0) As SALD_SaldoPFF
From Saldos S Inner Join #TmpSaldosR P On P.SUCR_Codigo = S.SUCR_Codigo
And
P.ALMA_Codigo = S.ALMA_Codigo And P.PROD_CodProd = S.PROD_CodProd
Where S.SALD_FecSaldo <= @SALD_FecSaldoF
Group by S.SUCR_Codigo, S.ALMA_Codigo, S.PROD_CodProd
Update #TmpSaldosT Set SALD_SaldoPFI = S.SALD_SaldoF
From #TmpSaldosT T Inner Join Saldos S On T.SUCR_Codigo = S.SUCR_Codigo
And
T.ALMA_Codigo = S.ALMA_Codigo And T.SALD_FecSaldo = S.SALD_FecSaldo And
T.PROD_CodProd = S.PROD_CodProd
Update #TmpSaldosR Set SALD_SaldoPFF = S.SALD_SaldoPFI
From #TmpSaldosR T Inner Join #TmpSaldosT S On T.SUCR_Codigo =
S.SUCR_Codigo
And T.ALMA_Codigo = S.ALMA_Codigo And T.PROD_CodProd = S.PROD_CodProd
Drop Table #TmpSaldosT
Select P.PROD_CodigoAnt, S.PROD_CodProd, P.PROD_Desc, M.MARC_Descripcion,
T.TIPO_DescC,
Case @UnidadMedida When 0 Then S.SALD_SaldoPFI When 1 Then
S.SALD_SaldoPFI
/ P.PROD_Factor End As SALD_SaldoPFI,
Case @UnidadMedida When 0 Then S.SALD_Ingresos When 1 Then
S.SALD_Ingresos
/ P.PROD_Factor End As SALD_Ingresos,
Case @UnidadMedida When 0 Then S.SALD_Salidas When 1 Then S.SALD_Salidas
/
P.PROD_Factor End As SALD_Salidas,
Case @UnidadMedida When 0 Then S.SALD_SaldoPFF When 1 Then
S.SALD_SaldoPFF
/ P.PROD_Factor End As SALD_SaldoPFF,
dbo.Alltrim(U.UBIC_Codigo) + dbo.Alltrim(U.UBIC_Desc) As UBIC_Desc,
P.PROD_ClaseABC, F.FAMI_Codigo, F.FAMI_Desc1, SF.SUBF_Codigo,
SF.SUBF_Desc1
From #TmpSaldosR S
Inner Join Productos P On S.PROD_CodProd = P.PROD_CodProd
Inner Join Tipos T On T.TIPO_CodTabla = P.TIPO_TabMed And T.TIPO_CodTipo
>> Case @UnidadMedida When 0 Then P.TIPO_CodMedV When 1 Then P.TIPO_CodMedC
End
Inner Join Marcas M On M.MARC_Codigo = P.MARC_Codigo
Inner Join Familias F On F.FAMI_Codigo = P.FAMI_Codigo
Inner Join Subfamilias SF On SF.SUBF_Codigo = P.SUBF_Codigo And
SF.FAMI_Codigo = P.FAMI_Codigo
Inner Join Catalogos C On S.SUCR_Codigo = C.SUCR_Codigo And
S.ALMA_Codigo >> C.ALMA_Codigo And S.PROD_CodProd = C.PROD_CodProd
Left Join Ubicaciones U On U.ALMA_Codigo = C.ALMA_Codigo And
U.UBIC_Codigo
= C.UBIC_Codigo
Order by S.PROD_CodProd
Drop Table #TmpSaldosR
Set NoCount Off

y lo que deseo es que con un parametro adicional me filter solo los datos
que tienen resultado es decir sean diferentes de 0 en el campo
S.SALD_SaldoPFF, entonces pense en hacer en esto y bueno no me funciona
ya
que no lo compila el query analizer, le aumente la clausula WHERE al
final
donde practicamente muestro los datos.

Alter Procedure SALDSS_SaldosPorRangosdeFechas --
SALDSS_SaldosPorRangosdeFechas '00', '001', '211', Null, '2005/08/01',
'2005/09/01', Null, 'T', 0, Null, Null, Null, 'Che', 'Color', 0
@SUCR_Codigo Char(2), @ALMA_Codigo Char(3), @FAMI_Codigo Char(4),
@SUBF_Codigo Char(5), @SALD_FechaI Datetime, @SALD_FechaF Datetime,
@MARC_Codigo Char(3), @PROD_Tipo Char(1), @UnidadMedida SmallInt,
@PROD_ClaseABC Char(1), @PROD_Desc_Contiene1 Varchar(80) = Null,
@PROD_Desc_Contiene2 Varchar(80) = Null, @PROD_Desc_NoContiene1
Varchar(80)
= Null, @PROD_Desc_NoContiene2 Varchar(80) = Null,
@SALD_ConSaldo Bit
As
Set NoCount On
Declare @SALD_FecSaldoI Char(10), @SALD_FecSaldoF Char(10), @SALD_FechaIM
Datetime
Select @SALD_FechaIM = @SALD_FechaI + 1
Select @SALD_FecSaldoI = Convert(Char(10), @SALD_FechaI, 102) ,
@SALD_FecSaldoF = Convert(Char(10), @SALD_FechaF, 102)
Create Table #TmpSaldosT (SUCR_Codigo Char(2), ALMA_Codigo Char(3),
SALD_FecSaldo Char(10), PROD_CodProd Char(15), SALD_SaldoPFI
Decimal(14,4)
Constraint [Pk_TmpSaldosT_SALDSS_SaldosProRangosdeFechas] Primary Key
Clustered (SUCR_Codigo, ALMA_Codigo, SALD_FecSaldo, PROD_CodProd) With
FillFactor = 90 On [Primary])
Create Table #TmpSaldosR (SUCR_Codigo Char(2), ALMA_Codigo Char(3),
PROD_CodProd Char(15), SALD_SaldoPFI Decimal(14,4), SALD_Ingresos
Decimal(14,4), SALD_Salidas Decimal(14,4), SALD_SaldoPFF Decimal(14,4)
Constraint [Pk_TmpSaldosR_SALDSS_SaldosProRangosdeFechas] Primary Key
Clustered (SUCR_Codigo, ALMA_Codigo, PROD_CodProd) With FillFactor = 90
On
[Primary])
Insert Into #TmpSaldosR
Select C.SUCR_Codigo, C.ALMA_Codigo, C.PROD_CodProd, 0, 0, 0, 0
From Productos P Inner Join Catalogos C On P.PROD_CodProd =
C.PROD_CodProd
Where C.SUCR_Codigo = @SUCR_Codigo And C.ALMA_Codigo = @ALMA_Codigo And
C.CATL_Activo = 'S'
And P.FAMI_Codigo = IsNull(@FAMI_Codigo, P.FAMI_Codigo) And
P.SUBF_Codigo >> IsNull(@SUBF_Codigo, P.SUBF_Codigo)
And P.MARC_Codigo = IsNull(@MARC_Codigo, P.MARC_Codigo) And P.PROD_Tipo
>> IsNull(@PROD_Tipo, P.PROD_Tipo)
And P.PROD_ClaseABC = IsNull(@PROD_ClaseABC, P.PROD_ClaseABC)
And P.PROD_Desc Like '%' + dbo.Alltrim(IsNull(@PROD_Desc_Contiene1,
P.PROD_Desc)) + '%' And P.PROD_Desc Like '%' +
dbo.Alltrim(IsNull(@PROD_Desc_Contiene2, P.PROD_Desc)) + '%'
And P.PROD_Desc Not Like dbo.Alltrim(IsNull('%' + @PROD_Desc_NoContiene1
+
'%', '')) And P.PROD_Desc Not Like dbo.Alltrim(IsNull('%' +
@PROD_Desc_NoContiene2 + '%', ''))
Insert Into #TmpSaldosT
Select S.SUCR_Codigo, S.ALMA_Codigo, Max(S.SALD_FecSaldo) As
SALD_FecSaldo,
S.PROD_CodProd, Convert(decimal(14,4), 0) As SALD_SaldoPFI
From Saldos S Inner Join #TmpSaldosR P On S.SUCR_Codigo = P.SUCR_Codigo
And
S.ALMA_Codigo = P.ALMA_Codigo And S.PROD_CodProd = P.PROD_CodProd
Where S.SALD_FecSaldo <= @SALD_FecSaldoI
Group by S.SUCR_Codigo, S.ALMA_Codigo, S.PROD_CodProd
Update #TmpSaldosT Set SALD_SaldoPFI = S.SALD_SaldoF
From #TmpSaldosT T Inner Join Saldos S On T.SUCR_Codigo = S.SUCR_Codigo
And
T.ALMA_Codigo = S.ALMA_Codigo And T.SALD_FecSaldo = S.SALD_FecSaldo And
T.PROD_CodProd = S.PROD_CodProd
Update #TmpSaldosR Set SALD_SaldoPFI = S.SALD_SaldoPFI
From #TmpSaldosR T Inner Join #TmpSaldosT S On T.SUCR_Codigo =
S.SUCR_Codigo
And T.ALMA_Codigo = S.ALMA_Codigo And T.PROD_CodProd = S.PROD_CodProd
Delete From #TmpSaldosT
Insert Into #TmpSaldosT
Select D.SUCR_Codigo, D.ALMA_Codigo, Convert(SmallDateTime, Getdate()),
D.PROD_CodProd, Sum(D.DVAL_CantIngr) As DVAL_CantIngr From DetValesAlm D
Inner Join Vales V On D.SUCR_Codigo = V.SUCR_Codigo And D.ALMA_Codigo >> V.ALMA_Codigo And D.TIPO_TabVale = V.TIPO_TabVale And D.TIPO_CodVale >> V.TIPO_CodVale And D.VALE_NumVale = V.VALE_NumVale
Inner Join #TmpSaldosR P On P.SUCR_Codigo = D.SUCR_Codigo And
P.ALMA_Codigo
= D.ALMA_Codigo And P.PROD_CodProd = D.PROD_CodProd
Where V.VALE_Estado = 'C' And D.DVAL_FecConfir Between @SALD_FechaIM And
@SALD_FechaF And V.VALE_Efecto = 'I'
Group By D.SUCR_Codigo, D.ALMA_Codigo, D.PROD_CodProd
Update #TmpSaldosR Set SALD_Ingresos = S.SALD_SaldoPFI
From #TmpSaldosR T Inner Join #TmpSaldosT S On T.SUCR_Codigo =
S.SUCR_Codigo
And T.ALMA_Codigo = S.ALMA_Codigo And T.PROD_CodProd = S.PROD_CodProd
Delete From #TmpSaldosT
Insert Into #TmpSaldosT
Select D.SUCR_Codigo, D.ALMA_Codigo, Convert(SmallDateTime, Getdate()),
D.PROD_CodProd, Sum(D.DVAL_CantSalida) DVAL_CantSalida From DetValesAlm D
Inner Join Vales V On D.SUCR_Codigo = V.SUCR_Codigo And D.ALMA_Codigo >> V.ALMA_Codigo And D.TIPO_TabVale = V.TIPO_TabVale And D.TIPO_CodVale >> V.TIPO_CodVale And D.VALE_NumVale = V.VALE_NumVale
Inner Join #TmpSaldosR P On P.SUCR_Codigo = D.SUCR_Codigo And
P.ALMA_Codigo
= D.ALMA_Codigo And P.PROD_CodProd = D.PROD_CodProd
Where V.VALE_Estado = 'C' And D.DVAL_FecConfir Between @SALD_FechaIM And
@SALD_FechaF And V.VALE_Efecto = 'S'
Group By D.SUCR_Codigo, D.ALMA_Codigo, D.PROD_CodProd
Update #TmpSaldosR Set SALD_Salidas = S.SALD_SaldoPFI
From #TmpSaldosR T Inner Join #TmpSaldosT S On T.SUCR_Codigo =
S.SUCR_Codigo
And T.ALMA_Codigo = S.ALMA_Codigo And T.PROD_CodProd = S.PROD_CodProd
Delete From #TmpSaldosT
Insert Into #TmpSaldosT
Select S.SUCR_Codigo, S.ALMA_Codigo, Max(S.SALD_FecSaldo) As
SALD_FecSaldo,
S.PROD_CodProd, Convert(decimal(14,4), 0) As SALD_SaldoPFF
From Saldos S Inner Join #TmpSaldosR P On P.SUCR_Codigo = S.SUCR_Codigo
And
P.ALMA_Codigo = S.ALMA_Codigo And P.PROD_CodProd = S.PROD_CodProd
Where S.SALD_FecSaldo <= @SALD_FecSaldoF
Group by S.SUCR_Codigo, S.ALMA_Codigo, S.PROD_CodProd
Update #TmpSaldosT Set SALD_SaldoPFI = S.SALD_SaldoF
From #TmpSaldosT T Inner Join Saldos S On T.SUCR_Codigo = S.SUCR_Codigo
And
T.ALMA_Codigo = S.ALMA_Codigo And T.SALD_FecSaldo = S.SALD_FecSaldo And
T.PROD_CodProd = S.PROD_CodProd
Update #TmpSaldosR Set SALD_SaldoPFF = S.SALD_SaldoPFI
From #TmpSaldosR T Inner Join #TmpSaldosT S On T.SUCR_Codigo =
S.SUCR_Codigo
And T.ALMA_Codigo = S.ALMA_Codigo And T.PROD_CodProd = S.PROD_CodProd
Drop Table #TmpSaldosT
Select P.PROD_CodigoAnt, S.PROD_CodProd, P.PROD_Desc, M.MARC_Descripcion,
T.TIPO_DescC,
Case @UnidadMedida When 0 Then S.SALD_SaldoPFI When 1 Then
S.SALD_SaldoPFI
/ P.PROD_Factor End As SALD_SaldoPFI,
Case @UnidadMedida When 0 Then S.SALD_Ingresos When 1 Then
S.SALD_Ingresos
/ P.PROD_Factor End As SALD_Ingresos,
Case @UnidadMedida When 0 Then S.SALD_Salidas When 1 Then S.SALD_Salidas
/
P.PROD_Factor End As SALD_Salidas,
Case @UnidadMedida When 0 Then S.SALD_SaldoPFF When 1 Then
S.SALD_SaldoPFF
/ P.PROD_Factor End As SALD_SaldoPFF,
dbo.Alltrim(U.UBIC_Codigo) + dbo.Alltrim(U.UBIC_Desc) As UBIC_Desc,
P.PROD_ClaseABC, F.FAMI_Codigo, F.FAMI_Desc1, SF.SUBF_Codigo,
SF.SUBF_Desc1
From #TmpSaldosR S
Inner Join Productos P On S.PROD_CodProd = P.PROD_CodProd
Inner Join Tipos T On T.TIPO_CodTabla = P.TIPO_TabMed And T.TIPO_CodTipo
>> Case @UnidadMedida When 0 Then P.TIPO_CodMedV When 1 Then P.TIPO_CodMedC
End
Inner Join Marcas M On M.MARC_Codigo = P.MARC_Codigo
Inner Join Familias F On F.FAMI_Codigo = P.FAMI_Codigo
Inner Join Subfamilias SF On SF.SUBF_Codigo = P.SUBF_Codigo And
SF.FAMI_Codigo = P.FAMI_Codigo
Inner Join Catalogos C On S.SUCR_Codigo = C.SUCR_Codigo And
S.ALMA_Codigo >> C.ALMA_Codigo And S.PROD_CodProd = C.PROD_CodProd
Left Join Ubicaciones U On U.ALMA_Codigo = C.ALMA_Codigo And
U.UBIC_Codigo
= C.UBIC_Codigo
Where (Case When @SALD_ConSaldo = 0 Then S.SALD_SaldoPFF <> 0 End)
Order by S.PROD_CodProd
Drop Table #TmpSaldosR
Set NoCount Off

Pense de que esta manera me funcionaria o es que tengo que partirlo el SP
con un IF y definir que se ejecuta.

Salu2



Preguntas similares