Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

estructurar consulta

Estas en el tema de estructurar consulta en el foro de Bases de Datos General en Foros del Web. necesito crear una consulta y ya hice el analisis, tengo las condiciones y campos, y necesito ke me ayuden a estructurarla, todo esto en SQL ...
  #1 (permalink)  
Antiguo 01/09/2004, 21:37
 
Fecha de Ingreso: junio-2004
Mensajes: 76
Antigüedad: 19 años, 10 meses
Puntos: 0
estructurar consulta

necesito crear una consulta y ya hice el analisis, tengo las condiciones y campos, y necesito ke me ayuden a estructurarla, todo esto en SQL SERVER!!

Manos a la obra!


los campos a mostrarse deben ser:Fecha, Nº_documentos_depositos, Suma_interes_Depositos, Nº_docs_devengados, Suma_interes_Devengados

la consulta debe devolver los registros entre dos fechas, por ejemplo campo fecha iria de 1-1-2004 a 31-1-2004(mes)

y en los campos 'numeros de documentos' y sumas deben ir el numero de docs. y las sumas de los interes de los documentos que se hayan realizado en dicha fecha.

criterio para el campo Suma_interes_Depositos:

Sum(Interes) from Operaciones where estado2='Cartera' and Fecha_Operacion = (al campo fecha respectivo)

criterio para el campo Suma_interes_Depositos:

Sum(Interes) from Operaciones where estado2='Deposito' ... y los campos Num_Docs.... deben ser el numero de docs(operaciones) and Fecha_deposito =(al campo fecha respectivo)


Ej: tendria ke kedar algo asi


Fecha-------Nº------Interes Deposito------Nº------Interes Devengado


1-1-2004----2--------230.678-------------3-------189.777----
1-2-2004----1--------120.111-------------1-------222.098----
........................
y asi hasta llegar a la fecha 30-2-2004

espero se haya entendido

Última edición por Guachalin; 02/09/2004 a las 11:36
  #2 (permalink)  
Antiguo 02/09/2004, 02:52
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 707
Antigüedad: 21 años, 1 mes
Puntos: 0
Y todo eso en que base de datos
  #3 (permalink)  
Antiguo 02/09/2004, 11:35
 
Fecha de Ingreso: junio-2004
Mensajes: 76
Antigüedad: 19 años, 10 meses
Puntos: 0
Cita:
Iniciado por Teri
Y todo eso en que base de datos
sql server
  #4 (permalink)  
Antiguo 03/09/2004, 02:05
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 707
Antigüedad: 21 años, 1 mes
Puntos: 0
Primero disculpa, no vi que habías puesto que era para SQl SErver

Sería algo así...
criterio para el campo Suma_interes_Depositos:
Sum(Interes) from Operaciones where estado2='Cartera' and Fecha_Operacion = (al campo fecha respectivo)

criterio para el campo Suma_interes_Depositos:
Sum(Interes) from Operaciones where estado2='Deposito' ... y los campos Num_Docs.... deben ser el numero de docs(operaciones) and Fecha_deposito =(al campo fecha respectivo)

Fecha-------Nº------Interes Deposito------Nº------Interes Devengado
1-1-2004----2--------230.678-------------3-------189.777----
1-2-2004----1--------120.111-------------1-------222.098----

SELECT * FROM
(SELECT Fecha, Count(1) AS NumDeposito, Sum(Intereses) as InteresesDeposito FROM TuTabla WHERE estado2 = 'Cartera' AND Fecha_Operacion = 'Fecha' GROUP BY Fecha) Cartera FULL OUTER JOIN (SELECT Fecha, Count(1) AS NumDevengado, Sum(Intereses) as InteresesDevengado FROM TuTabla WHERE estado2 = 'Deposito' AND Fecha_Operacion = 'Fecha' GROUP BY Fecha) Deposito
ON Cartera.Fecha = Deposito.Fecha

con los retoques justos y necesarios....

Un saludo
  #5 (permalink)  
Antiguo 03/09/2004, 02:12
 
Fecha de Ingreso: junio-2004
Ubicación: Castellón, España
Mensajes: 98
Antigüedad: 19 años, 10 meses
Puntos: 0
Si no he entendido mal, ¿Podrá ser algo así?

SELECT * FROM (SELECT Fecha FROM Operaciones GROUP BY Fecha) cns LEFT OUTER JOIN (SELECT Fecha, Sum(Intereses) AS Suma_intereses_Depositos, Count(Identificador) AS Nº_documentos_depositos FROM Operaciones WHERE estado2='Deposito' GROUP BY Fecha) cns_2 ON cns.Fecha=cns_2.Fecha LEFT OUTER JOIN (SELECT Fecha, Sum(Intereses) AS Suma_intereses_Devengados, Count(Identificador) AS Nº_docs_devengados FROM Operaciones WHERE estado2='cartera' GROUP BY Fecha) cns_3 ON cns.Fecha=cns_3.Fecha WHERE Fecha BETWEEN Fecha_primera AND Fecha_segunda
  #6 (permalink)  
Antiguo 03/09/2004, 06:41
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 707
Antigüedad: 21 años, 1 mes
Puntos: 0
Es otra forma de hacerlo..., y eso sí, siempre te va a sacar la fecha...

También se podría hacer en una sola SELECT con case, pero puede que el rendimiento sea peor...
  #7 (permalink)  
Antiguo 03/09/2004, 13:45
 
Fecha de Ingreso: junio-2004
Mensajes: 76
Antigüedad: 19 años, 10 meses
Puntos: 0
En primer lugar gracias a los dos :

primero revise la consulta de Teri, y luego de un rato probando mi consulta quedo asi:

SELECT * FROM
(SELECT Fecha, Count(Interes) AS NumDeposito, Sum(Interes) as InteresesDeposito FROM Operaciones WHERE estado2='Deposito' and Fecha = Fecha GROUP BY Fecha) Cartera FULL OUTER JOIN (SELECT Fecha, Count(Interes) AS NumDevengado, Sum(Interes) as InteresesDevengado FROM operaciones WHERE estado2 = 'Cartera' AND Fecha = Fecha GROUP BY Fecha) Deposito
ON Cartera.Fecha = Deposito.Fecha

Se ejecuta sin ningun problema salvo dos detalles:

los datos me los muestra asi:

Fecha--NºDeposito-InteresDeposito--Fecha-NºDevengado-Interes-Devengado

la idea es ke se muestre asi:

Fecha--NºDeposito-InteresDeposito--NºDevengado-Interes-Devengado

y la fecha no tiene que ser Null,supongamos hay suma en depositos pero en devengado no, la fecha tiene que mostrarse , en caso de no existir ni suma de deposito ni de devengado, no va la fecha, ni nada...

lo otro....ERROR MIO

NumereoDeposito y SumaDeposito hacen referencia a la Tabla 'Depositos' y NumeroDevengado y SumaDevengado a la tabla 'Operaciones', y en Depositos el campo a usar no es Fecha sino Fecha_Deposito

Espero me ayuden

Ahora vere la consulta de Atzeneta
  #8 (permalink)  
Antiguo 03/09/2004, 13:52
 
Fecha de Ingreso: junio-2004
Mensajes: 76
Antigüedad: 19 años, 10 meses
Puntos: 0
la de Atzeneta la modifique lo mas cercano a lo que quiero pero me manda un error:

SELECT * FROM (SELECT Fecha FROM Operaciones GROUP BY Fecha) cns LEFT OUTER JOIN (SELECT Fecha_deposito, Sum(Interes) AS Suma_intereses_Depositos, Count(Interes) AS Nº_documentos_depositos FROM Depositos GROUP BY Fecha_deposito) cns_2 ON cns.Fecha=cns_2.Fecha_deposito LEFT OUTER JOIN (SELECT Fecha, Sum(Interes) AS Suma_intereses_Devengados, Count(Interes) AS Nº_docs_devengados FROM Operaciones WHERE estado2='cartera' GROUP BY Fecha) cns_3 ON cns.Fecha=cns_3.Fecha WHERE Fecha BETWEEN 01-08-2004 AND 01-08-2004

me manda esto:

Servidor: mensaje 209, nivel 16, estado 1, línea 1
El nombre de columna 'Fecha' es ambiguo.
Servidor: mensaje 209, nivel 16, estado 1, línea 1
El nombre de columna 'Fecha' es ambiguo.

  #9 (permalink)  
Antiguo 04/09/2004, 20:15
 
Fecha de Ingreso: junio-2004
Ubicación: Castellón, España
Mensajes: 98
Antigüedad: 19 años, 10 meses
Puntos: 0
Eso te ha pasado porque en la claúsula WHERE tienes que poner la subconsulta en la que quieres filtrar el campo Fecha. Ponlo así:

WHERE cns.Fecha BETWEEN 01-08-2004 AND 01-08-2004

Perdona, sin darme cuenta hice a consulta fijándome sólo en tu problema y no me di cuenta de que al filtrar se produciría una abigüedad por el nombre del campo.

Última edición por Atzeneta; 04/09/2004 a las 20:23
  #10 (permalink)  
Antiguo 05/09/2004, 11:56
 
Fecha de Ingreso: junio-2004
Mensajes: 76
Antigüedad: 19 años, 10 meses
Puntos: 0
esta es la consulta corregida:

SELECT * FROM (SELECT Fecha FROM Operaciones GROUP BY Fecha) cns LEFT OUTER JOIN (SELECT Fecha_deposito, Sum(Interes) AS Suma_intereses_Depositos, Count(Interes) AS Nº_documentos_depositos FROM Depositos GROUP BY Fecha_deposito) cns_2 ON cns.Fecha=cns_2.Fecha_deposito LEFT OUTER JOIN (SELECT Fecha, Sum(Interes) AS Suma_intereses_Devengados, Count(Interes) AS Nº_docs_devengados FROM Operaciones WHERE estado2='cartera' GROUP BY Fecha) cns_3 ON cns.Fecha=cns_3.Fecha WHERE cns.Fecha BETWEEN 01-08-2004 AND 01-08-2004

El problema es ke no me muestra registros, y existen documentos en operaciones con estado2='cartera' y existen documentos en depositos
  #11 (permalink)  
Antiguo 06/09/2004, 00:56
 
Fecha de Ingreso: junio-2004
Ubicación: Castellón, España
Mensajes: 98
Antigüedad: 19 años, 10 meses
Puntos: 0
A ver si lo solucionamos,

Cuando filtras campos es necesario que la expresión de búsqueda tenga el mismo tipo de datos que el campo o expresión donde quieres buscar:

WHERE cns.Fecha BETWEEN CONVERT(DATETIME, '01/08/04') AND CONVERT(DATETIME, '01/08/04')

por otra parte, si sólo quieres buscar una fecha y no todas las comprendidas dentro de un intérvalo no es necesario el operador BETWEEN:

WHERE cns.Fecha = CONVERT(DATETIME, '01/08/04')
  #12 (permalink)  
Antiguo 06/09/2004, 11:33
 
Fecha de Ingreso: junio-2004
Mensajes: 76
Antigüedad: 19 años, 10 meses
Puntos: 0
lo intente y sigue sin mostrarme los datos, creo que el problema radica en un mal estructuramiento de la consulta

ke puede ser?

CONSULTA ACTUAL:

SELECT * FROM (SELECT Fecha FROM Operaciones GROUP BY Fecha) cns LEFT OUTER JOIN (SELECT Fecha_deposito, Sum(Interes) AS Suma_intereses_Depositos, Count(Interes) AS Nº_documentos_depositos FROM Depositos GROUP BY Fecha_deposito) cns_2 ON cns.Fecha=cns_2.Fecha_deposito LEFT OUTER JOIN (SELECT Fecha, Sum(Interes) AS Suma_intereses_Devengados, Count(Interes) AS Nº_docs_devengados FROM Operaciones WHERE estado2='cartera' GROUP BY Fecha) cns_3 ON cns.Fecha=cns_3.Fecha WHERE cns.Fecha BETWEEN CONVERT(DATETIME, '01/08/04') AND CONVERT(DATETIME, '01/08/04')


Última edición por Guachalin; 06/09/2004 a las 11:34
  #13 (permalink)  
Antiguo 07/09/2004, 00:15
 
Fecha de Ingreso: junio-2004
Ubicación: Castellón, España
Mensajes: 98
Antigüedad: 19 años, 10 meses
Puntos: 0
¿Me puedes pasar la estructura de las dos tablas que utilizamos en la consulta para ver donde falla? la consulta anterior debería de funcionarte.
  #14 (permalink)  
Antiguo 07/09/2004, 00:39
 
Fecha de Ingreso: junio-2004
Mensajes: 76
Antigüedad: 19 años, 10 meses
Puntos: 0
Tabla Operaciones

Num_operacion
Rut_cliente
Fecha
Cuenta
Titular
Num_documento
Fecha_vencimiento
Monto
Num_magico
Estado
Banco
Estado2
Rut_tercero
Interes

Tabla Depositos

Id_deposito
Num_deposito
Fecha_deposito
Valor_documento
Institucion
Cuenta
Titular
Num_documento
Fecha_vencimiento
Num_operacion
Rut_cliente
Interes
Banco

Última edición por Guachalin; 07/09/2004 a las 00:43
  #15 (permalink)  
Antiguo 07/09/2004, 01:32
 
Fecha de Ingreso: junio-2004
Ubicación: Castellón, España
Mensajes: 98
Antigüedad: 19 años, 10 meses
Puntos: 0
Yo he probado con la estructura que me has dado y esta consulta funciona correctamente:

SELECT cns.Fecha, cns_2.Suma_intereses_Depositos, cns_2.[Nº_documentos_depositos], cns_3.Suma_intereses_Devengados,
cns_3.[Nº_docs_devengados]
FROM (SELECT Fecha
FROM Operaciones
GROUP BY Fecha) cns LEFT OUTER JOIN
(SELECT Fecha_deposito, SUM(Interes) AS Suma_intereses_Depositos, COUNT(Interes) AS Nº_documentos_depositos
FROM Depositos
GROUP BY Fecha_deposito) cns_2 ON cns.Fecha = cns_2.Fecha_deposito LEFT OUTER JOIN
(SELECT Fecha, SUM(Interes) AS Suma_intereses_Devengados, COUNT(Interes) AS Nº_docs_devengados
FROM Operaciones
WHERE Estado2 = 'cartera'
GROUP BY Fecha) cns_3 ON cns.Fecha = cns_3.Fecha
WHERE (cns.Fecha BETWEEN CONVERT(DATETIME, '01/08/04') AND CONVERT(DATETIME, '01/08/04'))

Última edición por Atzeneta; 07/09/2004 a las 01:34
  #16 (permalink)  
Antiguo 07/09/2004, 10:31
 
Fecha de Ingreso: junio-2004
Mensajes: 76
Antigüedad: 19 años, 10 meses
Puntos: 0
ahi me mostro datos, todo okey salvo un detalle, la suma_intereses_devengados tambien puede ser NULL, osea se pude dar el caso que existan intereses en deposito pero no en operaciones(devengados)



pd: atzeneta gracias por darte el tiempo de ayudarme
pd2: la ultima consulta esta casi perfecta, salvo ese detalle

Última edición por Guachalin; 07/09/2004 a las 10:37
  #17 (permalink)  
Antiguo 07/09/2004, 14:53
 
Fecha de Ingreso: junio-2004
Ubicación: Castellón, España
Mensajes: 98
Antigüedad: 19 años, 10 meses
Puntos: 0
ahí hace falta una consulta de unón antes de agrupar fechas, ahora mismo lo miro y te lo pongo.
  #18 (permalink)  
Antiguo 07/09/2004, 15:02
 
Fecha de Ingreso: junio-2004
Ubicación: Castellón, España
Mensajes: 98
Antigüedad: 19 años, 10 meses
Puntos: 0
Un poco rápido, mira a ver si te funciona:

SELECT cns.Fecha, cns_2.Suma_intereses_Depositos, cns_2.[Nº_documentos_depositos], cns_3.Suma_intereses_Devengados,
cns_3.[Nº_docs_devengados]
FROM (SELECT Fecha FROM (SELECT Fecha
FROM Operaciones UNION SELECT Fecha_deposito AS Fecha FROM Depositos) ncs_0
GROUP BY Fecha) cns LEFT OUTER JOIN
(SELECT Fecha_deposito, SUM(Interes) AS Suma_intereses_Depositos, COUNT(Interes) AS Nº_documentos_depositos
FROM Depositos
GROUP BY Fecha_deposito) cns_2 ON cns.Fecha = cns_2.Fecha_deposito LEFT OUTER JOIN
(SELECT Fecha, SUM(Interes) AS Suma_intereses_Devengados, COUNT(Interes) AS Nº_docs_devengados
FROM Operaciones
WHERE Estado2 = 'cartera'
GROUP BY Fecha) cns_3 ON cns.Fecha = cns_3.Fecha
WHERE (cns.Fecha BETWEEN CONVERT(DATETIME, '01/08/04') AND CONVERT(DATETIME, '01/08/04'))
  #19 (permalink)  
Antiguo 07/09/2004, 15:25
 
Fecha de Ingreso: junio-2004
Mensajes: 76
Antigüedad: 19 años, 10 meses
Puntos: 0
Muchas gracias!!! funciona perfecto la consulta
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:10.