SQL Server - Consulta sobre mi query

 
Vista:
sin imagen de perfil
Val: 19
Ha aumentado su posición en 4 puestos en SQL Server (en relación al último mes)
Gráfica de SQL Server

Consulta sobre mi query

Publicado por Mariano (7 intervenciones) el 01/09/2020 18:04:44
Buenas tardes,,,

Los consulto por que hoy investigando sobre los desastres de programacion que colocaron desarrolladores que antes trabajaban en mi empresa me encontré con lo siguiente...

Tengo en un bloque load de un modulo del sistema que monitoreo lo siguiente...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
--primer consulta - CHEQUES A DEPÓSITAR ES DECIR QUE TIENEN 30 DIAS O MENOS DE LA FECHA DE PAGO
select che.NroCheque, che.fechapago, che.Importe, ban.BancoNombre, che.ClienteNombre, che.CUITTitular, che.NroCuentaTitular, che.CodigoPostal, loc.Localidad, loc.Provincia, tc.NroInternoChe
from CPTransferenciasFondos tf
left join CPTransCequesDetalle tc on tc.TransferenciaId = tf.IdTransferencia and tc.Estado = 'S'
left join ChequesTerceros che on che.NroInterno = tc.NroInternoChe and che.Estado = 'Cart.'
left join Bancos ban on ban.BancoID = che.BancoID
left join Localidades loc on loc.CodigoPostal = che.CodigoPostal
where tf.Estado = 'A' and tf.ModuloDestino = 25 and DateDiff(d, che.fechapago, getdate()) between 0 and 30
Order by che.FechaPago, che.Importe
--CHEQUES DE MENOS DE 1000
select che.NroCheque, che.fechapago, che.Importe, ban.BancoNombre, che.ClienteNombre, che.CUITTitular, che.NroCuentaTitular, che.CodigoPostal, loc.Localidad, loc.Provincia, tc.NroInternoChe
from CPTransferenciasFondos tf
left join CPTransCequesDetalle tc on tc.TransferenciaId = tf.IdTransferencia and tc.Estado = 'S'
left join ChequesTerceros che on che.NroInterno = tc.NroInternoChe and che.Estado = 'Cart.'
left join Bancos ban on ban.BancoID = che.BancoID
left join Localidades loc on loc.CodigoPostal = che.CodigoPostal
where tf.Estado = 'A' and tf.ModuloDestino = 25 and DateDiff(d, che.fechapago, getdate()) < 0 and che.importe < 1000
Order by che.FechaPago, che.Importe
--CHEQUES DE 1001 A 2999
select che.NroCheque, che.fechapago, che.Importe, ban.BancoNombre, che.ClienteNombre, che.CUITTitular, che.NroCuentaTitular, che.CodigoPostal, loc.Localidad, loc.Provincia, tc.NroInternoChe
from CPTransferenciasFondos tf
left join CPTransCequesDetalle tc on tc.TransferenciaId = tf.IdTransferencia and tc.Estado = 'S'
left join ChequesTerceros che on che.NroInterno = tc.NroInternoChe and che.Estado = 'Cart.'
left join Bancos ban on ban.BancoID = che.BancoID
left join Localidades loc on loc.CodigoPostal = che.CodigoPostal
where tf.Estado = 'A' and tf.ModuloDestino = 25 and DateDiff(d, che.fechapago, getdate()) < 0 and che.importe between 1000 and 2999
Order by che.FechaPago, che.Importe
--CHEQUES MAYORES A 2999
select che.NroCheque, che.fechapago, che.Importe, ban.BancoNombre, che.ClienteNombre, che.CUITTitular, che.NroCuentaTitular, che.CodigoPostal, loc.Localidad, loc.Provincia, tc.NroInternoChe
from CPTransferenciasFondos tf
left join CPTransCequesDetalle tc on tc.TransferenciaId = tf.IdTransferencia and tc.Estado = 'S'
left join ChequesTerceros che on che.NroInterno = tc.NroInternoChe and che.Estado = 'Cart.'
left join Bancos ban on ban.BancoID = che.BancoID
left join Localidades loc on loc.CodigoPostal = che.CodigoPostal
where tf.Estado = 'A' and tf.ModuloDestino = 25 and DateDiff(d, che.fechapago, getdate()) < 0 and che.importe > 2999
Order by che.FechaPago, che.Importe

Lo que hace en si eso es llenar una grilla en la cual primero consulta sobre cuantos cheques están próximos a vencer luego los que tienen distintos importes...

Por lo que se observa los querys son casi similares salvo las clausulas WHERE...

Ando en la búsqueda de optimizar este query y lo que se me ocurría era hacer una especie de CASE que englobe en un solo query todo lo que se ejecuta 4 veces cada vez que se abre esta ventana...

Es lógico lo que planteo o como puedo hacer para "juntar" esas querys y generar una sola y me traiga todo lo que estoy necesitando conseguir??

Muchas Gracias...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Francisco
Val: 73
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Consulta sobre mi query

Publicado por Francisco (29 intervenciones) el 02/09/2020 19:29:33
Hola

Para eso están los CTEs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
WITH cheques_a_depositar as(
	--primer consulta - CHEQUES A DEPÓSITAR ES DECIR QUE TIENEN 30 DIAS O MENOS DE LA FECHA DE PAGO
	SELECT
		che.NroCheque,
		che.fechapago,
		che.Importe,
		ban.BancoNombre,
		che.ClienteNombre,
		che.CUITTitular,
		che.NroCuentaTitular,
		che.CodigoPostal,
		loc.Localidad,
		loc.Provincia,
		tc.NroInternoChe
	FROM CPTransferenciasFondos tf
		LEFT JOIN CPTransCequesDetalle tc ON tc.TransferenciaId = tf.IdTransferencia AND tc.Estado = 'S'
		LEFT JOIN ChequesTerceros che ON che.NroInterno = tc.NroInternoChe AND che.Estado = 'Cart.'
		LEFT JOIN Bancos ban ON ban.BancoID = che.BancoID
		LEFT JOIN Localidades loc ON loc.CodigoPostal = che.CodigoPostal
	WHERE tf.Estado = 'A'
          AND tf.ModuloDestino = 25
	  AND DateDiff(d, che.fechapago, getdate()) BETWEEN 0 AND 30
),
cheques_menores_1000 AS(
	--CHEQUES DE MENOS DE 1000
	SELECT
		che.NroCheque,
		che.fechapago,
		che.Importe,
		ban.BancoNombre,
		che.ClienteNombre,
		che.CUITTitular,
		che.NroCuentaTitular,
		che.CodigoPostal,
		loc.Localidad,
		loc.Provincia,
		tc.NroInternoChe
	FROM CPTransferenciasFondos tf
		LEFT JOIN CPTransCequesDetalle tc ON tc.TransferenciaId = tf.IdTransferencia AND tc.Estado = 'S'
		LEFT JOIN ChequesTerceros che ON che.NroInterno = tc.NroInternoChe AND che.Estado = 'Cart.'
		LEFT JOIN Bancos ban ON ban.BancoID = che.BancoID
		LEFT JOIN Localidades loc ON loc.CodigoPostal = che.CodigoPostal
	WHERE tf.Estado = 'A'
	  AND tf.ModuloDestino = 25
	  AND DateDiff(d, che.fechapago, getdate()) < 0
	  AND che.importe < 1000
),
cheques_1000_a_2999 AS (
	--CHEQUES DE 1001 A 2999
	SELECT
		che.NroCheque,
		che.fechapago,
		che.Importe,
		ban.BancoNombre,
		che.ClienteNombre,
		che.CUITTitular,
		che.NroCuentaTitular,
		che.CodigoPostal,
		loc.Localidad,
		loc.Provincia,
		tc.NroInternoChe
	FROM CPTransferenciasFondos tf
		LEFT JOIN CPTransCequesDetalle tc ON tc.TransferenciaId = tf.IdTransferencia AND tc.Estado = 'S'
		LEFT JOIN ChequesTerceros che ON che.NroInterno = tc.NroInternoChe AND che.Estado = 'Cart.'
		LEFT JOIN Bancos ban ON ban.BancoID = che.BancoID
		LEFT JOIN Localidades loc ON loc.CodigoPostal = che.CodigoPostal
	WHERE tf.Estado = 'A'
	  AND tf.ModuloDestino = 25
	  AND DateDiff(d, che.fechapago, getdate()) < 0
	  AND che.importe BETWEEN 1000 AND 2999
),
cheques_mayores_2999 AS (
	--CHEQUES MAYORES A 2999
	SELECT
		che.NroCheque,
		che.fechapago,
		che.Importe,
		ban.BancoNombre,
		che.ClienteNombre,
		che.CUITTitular,
		che.NroCuentaTitular,
		che.CodigoPostal,
		loc.Localidad,
		loc.Provincia,
		tc.NroInternoChe
	FROM CPTransferenciasFondos tf
		LEFT JOIN CPTransCequesDetalle tc ON tc.TransferenciaId = tf.IdTransferencia AND tc.Estado = 'S'
		LEFT JOIN ChequesTerceros che ON che.NroInterno = tc.NroInternoChe AND che.Estado = 'Cart.'
		LEFT JOIN Bancos ban ON ban.BancoID = che.BancoID
		LEFT JOIN Localidades loc ON loc.CodigoPostal = che.CodigoPostal
	WHERE tf.Estado = 'A'
	  AND tf.ModuloDestino = 25
	  AND DateDiff(d, che.fechapago, getdate()) < 0
	  AND che.importe > 2999
),
cheques_todos AS(
	SELECT * FROM cheques_a_depositar
	UNION ALL
	SELECT * FROM cheques_menores_1000
	UNION ALL
	SELECT * FROM cheques_1000_a_2999
	UNION ALL
	SELECT * FROM cheques_mayores_2999
)
SELECT * FROM cheques_todos
ORDER BY FechaPago, Importe
;

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 19
Ha aumentado su posición en 4 puestos en SQL Server (en relación al último mes)
Gráfica de SQL Server

Consulta sobre mi query

Publicado por Mariano (7 intervenciones) el 02/09/2020 19:45:21
Muchas Gracias por tu pronta respuesta a mi consulta!!

Vamos a testearlo y te comento como nos fue!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar