Ver Mensaje Individual
  #2 (permalink)  
Antiguo 19/01/2011, 10:27
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 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.