SQL - Ayuda con consulta

 
Vista:

Ayuda con consulta

Publicado por MANELBIS (2 intervenciones) el 07/01/2005 10:59:08
Hola estoy diseñando una aplicacion en .NET y tengo el siguiente problema con una consulta y no se como relizarla.

Les agradeceria que me ayuadaran.

La tabla:

OT EQ1 R1
OT EQ2 R0
OT EQ3 R0
OT2 EQ1 R1
OT2 EQ2 R1
OT2 EQ3 R1

Donde OT = orden de trabajo
EQ = equipo
R1 = realizada --> '1' : R0 = no realizada --> = '0'

Lo que quiero es mostrar las OT q estan realizadas. --> que para 'TODOS' sus equipos sea --> R1.

La consulta que he realizado es la siguiente:

SELECT a.ORDENTRABAJO,a.DESORDENTRABAJO,Count(a.EQUIPO) AS TotalEquipos
FROM WK_OTSAP_PUENTE a
WHERE a.REALIZADA='1'
GROUP BY a.ORDENTRABAJO,a.DESORDENTRABAJO
HAVING (Count(a.EQUIPO))=(SELECT Count(*) AS total FROM WK_OTSAP_PUENTE
WHERE ordentrabajo=a.ordentrabajo)

Esta consulta puesta en la BD directamente funciona correctamente.

LA consulta funciona pero el DATAGRID del programa no le gusta el HAVING
es curioso porque cuando quito el having si que muestra resultados pero no los correctos oviamente.

Se les ocurre alguna otra sentencia sql?

Se lo agradeceria muchisimo

Gracias

Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

RE:Ayuda con consulta

Publicado por Liliana (426 intervenciones) el 07/01/2005 14:19:55
Hola,
Te envío dos alternativas:
1 - otra forma de escribir la consulta que tiene en el plan de ejecución una disminución del 30% del costo con pocos datos. Eso en cuanto a performance. Sigue teniendo HAVING, pero no entiendo porqué puede traerte problemas.
SELECT a.ORDENTRABAJO, a.DESORDENTRABAJO, Count(a.EQUIPO) AS Realizados, Count(CASE WHEN a.REALIZADA = '1' THEN a.EQUIPO END) AS TotalEquipos
FROM #OT a
GROUP BY a.ORDENTRABAJO,a.DESORDENTRABAJO
HAVING (Count(a.EQUIPO)) = Count(CASE WHEN a.REALIZADA = '1' THEN a.EQUIPO END)

2 - Sin HAVING, pero con un costo superior al tuyo.
SELECT Todas.OrdenTrabajo, Todas.DesOrdenTrabajo, Todas.TotalEquipos
FROM
(SELECT a.ORDENTRABAJO, a.DESORDENTRABAJO, Count(a.EQUIPO) AS TotalEquipos
FROM #OT a WHERE a.REALIZADA='1'
GROUP BY a.ORDENTRABAJO,a.DESORDENTRABAJO) realiz
INNER JOIN
(SELECT a.ORDENTRABAJO, a.DESORDENTRABAJO, Count(a.EQUIPO) AS TotalEquipos
FROM #OT a
GROUP BY a.ORDENTRABAJO,a.DESORDENTRABAJO) todas
ON realiz.TotalEquipos = todas.TotalEquipos AND
realiz.ordentrabajo = todas.ordentrabajo

Cuando hagas las pruebas, contanos cómo te fue.
Liliana.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con consulta

Publicado por MANELBIS (2 intervenciones) el 10/01/2005 13:51:59
Hola!
Muchas gracias! casi no me acordaba. AL final lo resolvi con una consulta propia antes de leer esto pero gracias igualmente. Lo del HAVING yo tampocolo lo entiendo debe ser culpa del driver, no se... entre .NET y mi pocket....
Se me olvidava el SQL era en Oracle.

La consulta es:

SELECT a.realizada,a.ordentrabajo,a.fechalimite,a.desordentrabajo,a.descentrocoste
FROM
(SELECT min(realizada) as realizada ,ordentrabajo,fechalimite,desordentrabajo,descentrocoste from
wk_otsap_puente group by ordentrabajo,fechalimite,desordentrabajo,descentrocoste) a
WHERE Realizada='1'

por cierto como haces para calcular el rendimiento.... donde lo pones esto?

Gracias

Manel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Ayuda con consulta

Publicado por Liliana (426 intervenciones) el 10/01/2005 14:42:25
Hola,
En el Analizador de Consultas de SQL, Consulta, Mostrar Plan de Ejecución.
De todas maneras, te cuento que tu consulta tiene exactamente el mismo costo y acceso a datos que la primera mía (asumiendo que hay índice por OT y Equipo), lo cual demuestra una vez más, que puede haber varias formas de llegar al mismo resultado y con un buen rendimiento.
Saludos!
Liliana.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con consulta

Publicado por Jaime (17 intervenciones) el 07/01/2005 15:38:29
Buenos Dias Manelbis,

Bueno si no entiendo mal lo que quiere es hallar el calculo para aquellas ORDENTRABAJO cumplidas en la totalidad, si es asi, se me ocurre lo siguiente.

SELECT a.ORDENTRABAJO,a.DESORDENTRABAJO,Count(a.EQUIPO) AS TotalEquipos
FROM WK_OTSAP_PUENTE a
WHERE a.REALIZADA='1' and A.ORDENTRABAJO not in (SELECT ORDENTRABAJOFROM WK_OTSAP_PUENTE
WHERE Realizada <> 1)
GROUP BY a.ORDENTRABAJO,a.DESORDENTRABAJO
HAVING (Count(a.EQUIPO))=(SELECT Count(*) AS total FROM WK_OTSAP_PUENTE
WHERE ordentrabajo=a.ordentrabajo)

Bueno a diferencia de Liliana, yo no puedo asegurar cual Query conlleva mas costo Entre esta, la planteada originalmente y las de ella, pero creo que el costo de esta no es muy alto.

Liliana, me gustaria conocer su opinión, la considero valiosa.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Ayuda con consulta

Publicado por Liliana (426 intervenciones) el 07/01/2005 16:20:45
Hola Jaime,
Esto es lo que yo llamo aprender juntos.
Estos son los resultados de cada una de las consultas planteadas anteponiendo:
set statistics io on
go

Como verás, las subconsultas no son gratuitas...
--Manelbis
Tabla '#OT_'. Número de exploraciones 3, lecturas lógicas 6, lecturas físicas 0, lecturas anticipadas 0.
Costo de la consulta: 22.83%

-- Primera mía
Tabla '#OT_'. Número de exploraciones 1, lecturas lógicas 2, lecturas físicas 0, lecturas anticipadas 0.
Costo de la consulta: 15:51%

-- segunda mía (sin having)
Tabla '#OT_'. Número de exploraciones 2, lecturas lógicas 4, lecturas físicas 0, lecturas anticipadas 0.
Costo de la consulta: 36.64%

--Jaime:
Tabla '#OT_'. Número de exploraciones 6, lecturas lógicas 14, lecturas físicas 0, lecturas anticipadas 0.
Costo de la consulta: 25.01%

Todavía falta ver si Manelvis resolvió el problema con el HAVING, que es lo que más me intriga en este momento.
Saludos, Liliana.
PD: Mando un mensaje algo más extenso a tu correo porque no lo acepta acá-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar