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

por favor, ayuda con consulta

Estas en el tema de por favor, ayuda con consulta en el foro de Oracle en Foros del Web. hola, tengo una duda y les agradeceria si me pudieran ayudar. Tengo el siguiente esquema: Fotografos( id_fotografo , nombre_fotografo) Reportajes( cod_reportaje ,precio_reportaje , fecha_realizacion , ...
  #1 (permalink)  
Antiguo 18/01/2011, 16:38
 
Fecha de Ingreso: noviembre-2010
Mensajes: 6
Antigüedad: 13 años, 4 meses
Puntos: 0
Pregunta por favor, ayuda con consulta

hola, tengo una duda y les agradeceria si me pudieran ayudar.

Tengo el siguiente esquema:
Fotografos( id_fotografo , nombre_fotografo)

Reportajes( cod_reportaje ,precio_reportaje , fecha_realizacion , id_fotografo )

Editoriales( cod_editorial , nombre_editorial )

Comprar( cod_editorial , cod_reportaje )

Exclusivas( cod_exclusiva , titulo_exclusiva , precio_exclusiva ,fecha_entrega , cod_editorial )

Solicitar( cod_exclusiva , fecha_solicitud , id_fotografo )


Necesito sacar el importe total a pagar a cada fotografo tanto por sus reportajes realizados como por sus exclusivas entregadas en noviembre de 2010.

Tengo esto:

select distinct f.id_fotografo,sum(r.precio_reportaje)
from fotografos f, reportajes r, comprar c
where (f.id_fotografo = r.id_fotografo) and
(r.cod_reportaje = c.cod_reportaje) and
(r.fecha_realizacion between '01-nov-10' and '30-nov-10')
group by f.id_fotografo
union
select distinct f.id_fotografo, sum(e.precio_exclusiva)
from fotografos f, exclusivas e, solicitar s
where (f.id_fotografo = s.id_fotografo) and
(s.cod_exclusiva = e.cod_exclusiva) and
(e.fecha_entrega between '01-nov-10' and '30-nov-10')
group by f.id_fotografo);

y me resulta:

ID_FOTOGRA SUM(R.PRECIO_REPORTAJE)
---------- -----------------------
gisviva 2000
gisviva 4000
patmeji 400
patmeji 1500
robmore 3000


y yo necesito que me salga :

ID_FOTOGRA SUM(R.PRECIO_REPORTAJE)
---------- -----------------------
gisviva 6000
patmeji 1900
robmore 3000

e intentado de varias maneras pero no lo logro, me he quedado con el resultado menos malo para ponerlo aqui.
  #2 (permalink)  
Antiguo 19/01/2011, 10:27
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: por favor, ayuda con consulta

Hola gise1985:

Tengo que hacerte algunas observaciones antes que nada sobre la forma en que estás haciendo las consultas.

Primero, cuanto tengas necesidad de unir dos o más tablas UTILIZA LA CLÁUSULA JOIN, INNER JOIN, LEFT JOIN O RIGTH JOIN según sea el caso en lugar de hacer la unión explícita en el WHERE:

Código:
select campo from Tabla1 INNER JOIN Tabla2 ON Tabla1.id = Tabla2.id
En lugar de esto

Código:
select campo from Tabla1, Tabla2 where Tabla1.id = Tabla2.id
Aunque el resultado es el mismo el performance de la consulta varia muchísimo, además la consulta es más legible, si tienes duda sobre el uso del JOIN pregúntale a Santa Wikipedia o a San Google.

Segundo, en el listado de tus tablas mencionas una llamada Editoriales( cod_editorial , nombre_editorial ), pero en la consulta que das de ejemplo nunca la utilizas, es posible que te falte definir alguna relación entre las tablas, por lo que te sugiero que revises esto.

Ahora bien, con respecto a tu problema, la solución más fácil sería simplemente que hagas una subconsulta sobre lo que tienes hecho y agrupes nuevamente, es decir algo como esto:

Código SQL:
Ver original
  1. SELECT T1.id_fotografo, SUM(total) FROM
  2. (
  3. SELECT DISTINCT f.id_fotografo,SUM(r.precio_reportaje) AS total
  4. FROM fotografos f, reportajes r, comprar c
  5. WHERE (f.id_fotografo = r.id_fotografo) AND
  6. (r.cod_reportaje = c.cod_reportaje) AND
  7. (r.fecha_realizacion BETWEEN '01-nov-10' AND '30-nov-10')
  8. GROUP BY f.id_fotografo
  9. UNION
  10. SELECT DISTINCT f.id_fotografo, SUM(e.precio_exclusiva) AS total
  11. FROM fotografos f, exclusivas e, solicitar s
  12. WHERE (f.id_fotografo = s.id_fotografo) AND
  13. (s.cod_exclusiva = e.cod_exclusiva) AND
  14. (e.fecha_entrega BETWEEN '01-nov-10' AND '30-nov-10')
  15. GROUP BY f.id_fotografo)
  16. ) T1
  17. GROUP BY T1.id_fotografo;

Esto debería ser suficiente, sin embargo la consulta no es para nada óptima.

Otra manera de poder hacerlo sería mas o menos así:

Código SQL:
Ver original
  1. SELECT
  2. f.id_fotografo,
  3. f.nombre_fotografo,
  4. SUM(nvl(r.precio_reportaje, 0) + nvl(e.precio_exclusiva, 0))
  5. FROM fotografos f
  6. LEFT JOIN reportajes r ON f.id_fotografo = r.id_fotografo
  7. LEFT JOIN comprar c ON r.cod_reportaje = c.cod_reportaje
  8. LEFT JOIN solicitar s ON f.id_fotografo = s.id_fotografo
  9. LEFT JOIN exclusivas e ON s.cod_exclusiva = e.cod_exclusiva
  10. WHERE
  11. r.fecha_realizacion BETWEEN '01-nov-10' AND '30-nov-10'
  12. GROUP BY f.id_fotografo, f.nombre_fotografo

En estos momentos no tengo modo de probar la consulta, pero creo que debería de funcionar bastante bien, como vez aquí las uniones se hacen utilizando JOIN (LEFT JOIN en este caso) solo hay que tener cuidado con el manejo de las fechas.

Haz la prueba y nos comentas los resultados.

Saludos.
Leo.

Etiquetas: consulta, sqlo
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 15:40.