Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consultas Anidadas o Maestro/Detalle? (https://www.clubdelphi.com/foros/showthread.php?t=55)

judoboy 05-05-2003 12:55:14

Consultas Anidadas o Maestro/Detalle?
 
Hola quiero hacer una consulta anidada, y no se muy bien como hacerlo.

YO hago lo siguiente realizo una consulta, ej:busco unas actividades, y luego de estas actividades me interesa saber el total de horas que se han realizado, y para ello hago esto

Una 1ª Query donde busco las Actividades, y después una 2ª Query donde busco las horas de las actividades encontradas en la 1ª Query.
Para ello en el DataSource de la 2ª Query le meto el DataAccess que esta relacionado con la 1ª Query. Y en la 2ª query hago referencia al campo que enlaza ambas Querys (relación maestro/detalle) mediante un parametro en la cláusula WHERE.

Pero pasa lo siguiente:
La 1ª Query me muestra todas las ACtividades que busco, pero en la 2ª Query sólo me muestra las horas de la primera Actividad.

__cadetill 05-05-2003 16:02:33

Podrias poner los campos de las tablas y como se relacionan entre ellas? Asi podriamos mirar de hacer el SQL

__marcsc 05-05-2003 16:13:04

Hola,

como te dice cadetill lo mejor que puedes hacer explicar un poco más sobre tus tablas, ya que será más fácil obtener una solución.

En primer lugar es normal que el usar 2 queries ligadas por el DataSource del detalle no te sirva para tu caso concreto. El DataSource de un Query te permite simular un maestro/detalle, pero parece que lo que tu necesitas es algo más que eso.

A grosso modo, el SQL debería ser algo así:

Código:

select campo1, ... , campoN,
(select sum(Horas)
 from TablaHoras H
 where H.Actividad = A.Actiidad)
from Actividades A

Eso es un esquema muy abstracto, pero de lo que se trata es que haces una subconsulta, y en esa subconsulta debes establecer una condición where que te permita seleccionar solamente los registros de la tabla de horas correspondientes al registro actual del query principal.

Espero que se entienda y que te sirva :)

Saludos.

judoboy 05-05-2003 16:52:11

Os comento un poco mejor.

Tengo una tablas Parte_Trabajo, Lin_Parte_Trabajo, Obra y Actividad.

Y yo quiero obtener el total de horas de todas las Actividades en
que se han realizado en una cierta Obra.

En Parte Trabajo, almaceno un campo Obra que es una Clave Ajena a la tabla Obra.
En la tabla Lin_Parte_Trabajo, relaciono dicha tabla con Parte Trabajo mediante un campo llamado PARTE, y otro campo Actividad para relacionar con la table Actividad.

__cadetill 05-05-2003 17:06:59

a ver si te sirve esto

Código:


select sum(horas)
from parte p, linParte l, actividad a
where o.obra = 'Obra que quiero' and
      l.parte = p.parte and
      a.actividad = l.actividad

donde Obra que quiero es la obra de la que quieras sumar las horas de actividad

judoboy 05-05-2003 17:15:52

Gracias por vuestras respuestas.

Cadetill como tu dices obtengo las horas totales de cada actividad, pero es que yo quiero que me muestre el nombre de la actividad y las horas totales.


y esto no puedo hacerlo SELECT A.NOMBRE, SUM(LP.HORA_TOTAL) AS SUMA FROM ACTIVIDADES A,...

__cadetill 05-05-2003 18:32:02

si nombre pertenece a la tabla Actividad por qué no puedes hacerlo???? Te da algún tipo de error?? :confused:

__cadetill 05-05-2003 18:33:38

jejejeje, claro que te da un error :p

debes añadir al SQL una clausula Group By

Código:

select a.nombre, sum(horas)
from parte p, linParte l, actividad a
where o.obra = 'Obra que quiero' and
      l.parte = p.parte and
      a.actividad = l.actividad
group by a.nombre

En que estaria pensando al contestarte!!!! :P

judoboy 05-05-2003 18:48:05

Perfecto, muchas gracias, era eso que faltaba la cláusula Group By.

;)


La franja horaria es GMT +2. Ahora son las 18:07:47.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi