PDA

Ver la Versión Completa : Problemas con consulta SQL


lgarcia
03-06-2005, 21:01:40
Hola y gracias por su colaboracion

Tengo un problema con una consulta y es relativo a 2 fechas que se obtienen de diferentes BD y que sus valores no son iguales y yo quiero obtener en una linea las dos fechas. El codigo es el siguiente:

CREATE PROCEDURE DatosDepositos
@tiendasala int,
@tienda int,
@fecha1 datetime,
@fecha2 datetime
AS
CREATE TABLE #temporal
(
numero char(10),
declarado money,
fechadeclarado datetime,
contado money,
fechacontado datetime
)
INSERT INTO #temporal
SELECT numero, total_contado, fecha, 0, ''
FROM Sala.dbo.Bolsos
WHERE fecha between @fecha1 and @fecha2 and usuario = @tiendasala
UNION ALL
SELECT numero, 0, '', importe, fecha
FROM dbo.Depositos
WHERE fecha between @fecha1 and @fecha2 and tienda = @tienda
SELECT numero, SUM(declarado) as declarado, fechadeclarado, SUM(contado) as contado, fechacontado
FROM #temporal
GROUP BY numero, fechadeclarado, fechacontado
GO

Cuando hago el group by me salen 2 lineas por cada numero. Existe alguna forma de darle tratamiento a las fechas para obviarlas del Group By.

Trabajo con D7, ADO y MSSQL 2000.

Gracias por su atencion

Saludos
Luis Garcia

_____________________________
La mejor manera de decir es hacer

__hector
03-06-2005, 21:25:25
convierte las fechas a tipo varchar, y dale un group by

te funcionaria un:

convert(varchar, fecha, 101)

lgarcia
03-06-2005, 22:07:46
Gracias por la respuesta, el problema radica en que al no ser las fechas iguales cuando le aplique el Group By me va a dar 2 lineas para un mismo numero con las 2 fechas.

Gracias
Luis Garcia

_____________________________
La mejor manera de decir es hacer

jachguate
03-06-2005, 22:58:03
no incluyas las fechas.. solo el número:


Select numero, count(*)
from #temporal
group by numero


Hasta luego.

;)

lgarcia
03-06-2005, 23:34:34
El problema es que tengo que poner las fechas para poder comparar la fecha de entrada de un deposito con la fecha de su conteo.

Muchas gracias por la respuesta seguiremos investigando.

Luis Garcia

_____________________________
La mejor manera de decir es hacer

jachguate
04-06-2005, 00:58:48
Y cual de las fechas tenes que poner, si las son distintas :confused:

Xianto
04-06-2005, 19:58:15
2 cosas...

1) Nunca hagas un union, porque segun mi experiencia con SQL, si bien las tablas necesitan ser iguales, la consulta puede producir resultados distintos, asi que siempre mejor usar tablas temporales... donde en ambas guardas los datos que necesitas y luego por medio de un select puedes sacar los datos que necesitas...

2) Has probado meter ambos resultados en tablas temporales y sacarlos con un SELECT DISTINCT ???? eso creo, seria tu solucion.

Con el tema de las tablas temporales tienes 2 opciones:

CREATE @tabla TABLE (campos)
CREATE TABLE #tabla (campos)

La diferencia, es el tipo de tabla temporal, si bien las 2 son temporales, la que se crea con #tabla si bien es temporal a su vez es fisica, lo que significa que el server la crea como un objeto temporal por lo cual hasta que no termina la consulta la tabla existe... La otra @tabla es solo de memoria, asi que por propia experiencia te sugiero que solo utilices @tabla cuando no pases los 4000 registros, ya que si lo haces y varias consultas son ejecutadas al mismo tiempo el equipo se pone "tonto" y un simple "select * from tabla where 1=0" puede tardar 5 minutos, eso es porque MSSQL fragmenta mucho la memoria en este tipo de tabla....

Saludetes !

jachguate
06-06-2005, 17:24:59
Hola Xianto.

Con respecto de:
1) Nunca hagas un union, porque segun mi experiencia con SQL, si bien las tablas necesitan ser iguales, la consulta puede producir resultados distintos

No entiendo bien que significa para vos que la consulta pueda producir "resultados distintos".

¿distintos a que?

En mi experiencia, las uniones son sumamemte útiles y constituyen una fortaleza de SQL, y atacarlas de este modo, sin dar mayores argumentos no me parece buena idea.

Quizas estemos hablando de cosas distintas, asi que te agradeceré argumentar tu aseveración.

Hasta luego.

;)

lgarcia
08-06-2005, 16:43:21
Muchas gracias por sus respuestas y por el interesante debate al final resolvi el problema haciendo un select relacionando las tablas de 2 BD diferentes aprovechando el campo comun a ambas,ahi les muestro el codigo para que el que tenga un problema parecido le pueda dar solucion:
CREATE PROCEDURE DatosDepositos
@tienda int,
@fecha1 datetime,
@fecha2 datetime
AS
SELECT Sala.dbo.Bolsos.numero, CONVERT(VARCHAR(10), Depositos.fecha, 103) as fechadeposito,
CONVERT(VARCHAR(10), Sala.dbo.Bolsos.fecha_conteo, 103) as fechaconteo,
Tienda.dbo.Depositos.importe as declarado, Sala.dbo.Detalles.gravamen as contado
FROM Sala.dbo.Bolsos INNER JOIN
Sala.dbo.Bolso_Detalles ON Sala.dbo.Bolsos.id = Sala.dbo.Bolso_Detalles.idbolso INNER JOIN
Sala.dbo.Detalles ON Sala.dbo.Bolso_Detalles.iddetalles = Sala.dbo.Detalles.id INNER JOIN
Tienda.dbo.Depositos ON Sala.dbo.Bolsos.numero = Tienda.dbo.Depositos.numero
WHERE tienda = @tienda and Tienda.dbo.Depositos.fecha between @fecha1 and @fecha2
GO

Saludos
Luis Garcia

_____________________________
La mejor manera de decir es hacer

Xianto
09-06-2005, 21:33:12
Nas...

Jachguate con motivo de las union, mi recomendacion de no usarlas, es porque a menos que los resultados que estas sacando de las x selects que tengas sean todos correctos y esten bien construidos, podrian salir resultados inesperados, por esto es siempre mas facil trabajar con tablas temporales, incluso es mas rapido si las tablas no estan indexadas por los campos con lo que haces la join.

Por otro lado, en los grupos de SQL que hay en google, podras encontrar algunos comentarios sobre unions que fallan aunque las querys sean correctas... Parte de este problema se soluciona con el SP 4, del sql 2000, aunque equipos con mas de 2 gb de memoria, aun no puedan instalarlo, porque este y otros problemas se verian aumentados...

Saludetes !!!

jachguate
10-06-2005, 01:28:16
Parte de este problema se soluciona con el SP 4, del sql 2000,

Bueno, he de reconocer que habia olvidado que se trata de MS SQL Server... creo entonces que es muy posible que tengas razón, aunque francamente es triste, no te parece... :rolleyes:

Saludos.

Xianto
10-06-2005, 13:30:06
Ahora... sabes que esto es lo fabuloso de los FOROS.

Ya que aunque el código sea correcto, muchas veces falla por problemas del "proveedor" por asi decirlo.

Lo de Micro$oft pues es muy asi, hoy anda y mañana no, y nadie se explica el porque... aunque entre todos tratamos de solucionarlo dando opciones, eso es lo genial !

Saludetes !!!

kuan-yiu
31-07-2006, 11:48:03
Buceando por el foro he encontrado este hilo en el que se hace referencia a algo que me podría servir, pero que desconozco totalmente.

[...]
La otra @tabla es solo de memoria, asi que por propia experiencia te sugiero que solo utilices @tabla cuando no pases los 4000 registros[...]
Me interesa saber algo más de este tipo de tablas. ¿Alguien puede darme algún enlace para documentarme? (Si es en castellano mejor)
He visto que también se llaman "Variables de tabla", pero no tengo demasiado claras sus limitaciones. ¿Podría usar la misma tabla en varios procedimientos diferentes? ¿Se puede usar una misma tabla durante una sesión? (entendiendo como sesión el tiempo que invierta el usuario dentro de la aplicación) ¿Se pueden utilizar varias al mismo tiempo?