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

Porcentaje condicional con agrupacion de fechas

Estas en el tema de Porcentaje condicional con agrupacion de fechas en el foro de SQL Server en Foros del Web. Buenas Noches! Les agradecería me pudieran resolver acerca de una duda que lleva bloqueándome muchísimo tiempo. Dispongo de una base de datos con un campo ...
  #1 (permalink)  
Antiguo 03/12/2008, 16:05
 
Fecha de Ingreso: diciembre-2008
Mensajes: 10
Antigüedad: 15 años, 5 meses
Puntos: 0
Mensaje Porcentaje condicional con agrupacion de fechas

Buenas Noches!

Les agradecería me pudieran resolver acerca de una duda que lleva bloqueándome muchísimo tiempo.

Dispongo de una base de datos con un campo fecha (en formato DateTime (con hora)), un atributo condicional (Sí o No) y con más datos como el identificador.
Quisiera hacer una consulta para poder calcular el porcentaje de registros cuyo atributo condicional = Sí, en comparación con los que su atributo condicional = NO, EN ESE MISMO DÍA. Dado que el campo fecha me devuelve tanto el día/mes/año como la hora, no se como puedo filtrar el porcentaje para que n0 me calcule el total de todos, sino para cada día el % de 'Sí' en comparación con el de 'Noes'.

Haciendo la siguiente consulta consigo agrupar todos los registros que se producen en un mismo día (debido a horas distintas) en uno sólo, pero el total se corresponde con el Nº de 'Sí y Noes' de ese día en comparación con TODOS los días, y yo busco hacerlo PARA UN MISMO DÍA.[/LEFT][/RIGHT]


DECLARE @total decimal SELECT @total = COUNT(AtributoCondicional)
FROM Incident
SELECT DAY(FechaRevision) AS dia, MONTH(FechaRevision) AS mes, YEAR(FechaRevision) AS año, COUNT(AtributoCondicional) * 100 / @total AS porcentaje
FROM Incident AS Incident_1
GROUP BY DAY(FechaRevision), MONTH(FechaRevision), YEAR(FechaRevision)
ORDER BY año, mes, dia



No se como puedo introducir la condicion del atributo condicional para hacer el filtrado, porque no logro averiguar donde poner el WHERE atributoCondicional='Si'


Un saludo y un millón de gracias!
  #2 (permalink)  
Antiguo 03/12/2008, 16:41
Avatar de Thumper  
Fecha de Ingreso: agosto-2004
Ubicación: Jesús María - Lima - Perú
Mensajes: 270
Antigüedad: 19 años, 8 meses
Puntos: 6
Respuesta: Porcentaje condicional con agrupacion de fechas

Hola q tal ayudaria un poco que colocaras datos de pruebas, por lo que entiendo deseas:

01-01-2008 SI
01-01-2008 NO
01-01-2008 SI


SI -> cantidad 2
NO -> cantidad 1

El resultado de tu consulta seria 200%?

Saludos
__________________
Martín Alexis Valdivia S.
-----------------------------
"Quisiéramos cambiar el mundo, pero Dios no nos daría el código fuente." CAP
"Si Saber No Es Un Derecho, Seguro Será Un Izquierdo." WD
  #3 (permalink)  
Antiguo 03/12/2008, 16:56
 
Fecha de Ingreso: diciembre-2008
Mensajes: 10
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Porcentaje condicional con agrupacion de fechas

Disculpa, pero se me había pasado.

Si mis datos iniciales me muestran algo así:

01-01-2008 SI
01-01-2008 NO
01-01-2008 SI
02-01-2008 NO
02-01-2008 SI

La consulta me habría de devolver:

Fecha % del Si
-------- ----------
01-01-2008 66
02-01-2008 50



Por si os sirve de ayuda, ahora he conseguido comprimir el código anterior y hacerlo un poco más legible, aunque no se donde meter la condicion para que el porcentaje se me haga diariamente



SELECT fecha, COUNT(*) AS RecId
FROM (SELECT CONVERT(varchar(10), FechaRevision, 111) AS fecha
FROM Incident AS Incident_1
WHERE (AtributoCondicional = 'Si')) AS a_1
GROUP BY fecha
ORDER BY fecha


Mil gracias de nuevo por todas las molestias
  #4 (permalink)  
Antiguo 03/12/2008, 17:06
Avatar de Thumper  
Fecha de Ingreso: agosto-2004
Ubicación: Jesús María - Lima - Perú
Mensajes: 270
Antigüedad: 19 años, 8 meses
Puntos: 6
Respuesta: Porcentaje condicional con agrupacion de fechas

Espero q te sirva, hay q mejorarlo, pero ahorita toy d salida del trabajo.

Código sql:
Ver original
  1. DECLARE @TABLE TABLE ( fecha datetime, condicional CHAR(2))
  2.  
  3. INSERT INTO @TABLE VALUES( getdate() , 'si' )
  4. INSERT INTO @TABLE VALUES( getdate() , 'si' )
  5. INSERT INTO @TABLE VALUES( getdate() , 'no' )
  6.  
  7. INSERT INTO @TABLE VALUES( dateadd(DAY, -1, getdate()) , 'no' )
  8. INSERT INTO @TABLE VALUES( dateadd(DAY, -1, getdate()) , 'no' )
  9. INSERT INTO @TABLE VALUES( dateadd(DAY, -1, getdate()) , 'si' )
  10.  
  11. SELECT DISTINCT *,
  12.     [%_si] = (cont1 / ((cont1+cont2) * 1.0))*100,
  13.     [%_no] = (cont2 / ((cont1+cont2) * 1.0))*100
  14. FROM (
  15. SELECT  anio = YEAR(t.fecha),
  16.     mes = MONTH(t.fecha),
  17.     dia = DAY(t.fecha),
  18.     cont1 = (SELECT COUNT(t1.condicional) FROM @TABLE t1
  19.          WHERE  YEAR(t1.fecha) = YEAR(t.fecha) AND 
  20.             MONTH(t1.fecha) = MONTH(t.fecha) AND
  21.             DAY(t1.fecha) = DAY(t.fecha) AND
  22.             condicional = 'si' ),
  23.     cont2 = (SELECT COUNT(t1.condicional) FROM @TABLE t1
  24.          WHERE  YEAR(t1.fecha) = YEAR(t.fecha) AND 
  25.             MONTH(t1.fecha) = MONTH(t.fecha) AND
  26.             DAY(t1.fecha) = DAY(t.fecha) AND
  27.             condicional = 'no' )   
  28. FROM @TABLE t ) xx

Saludo
__________________
Martín Alexis Valdivia S.
-----------------------------
"Quisiéramos cambiar el mundo, pero Dios no nos daría el código fuente." CAP
"Si Saber No Es Un Derecho, Seguro Será Un Izquierdo." WD
  #5 (permalink)  
Antiguo 03/12/2008, 17:57
 
Fecha de Ingreso: diciembre-2008
Mensajes: 10
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Porcentaje condicional con agrupacion de fechas

Muchas Gracias Thumper.

Acabo de probar el código adaptado a mi consulta, pero me doy cuenta de que el porcentaje que me calcula para cada día es siempre el mismo, porque el número de 'Si' y 'No' es siempre el mismo. Quizá sea porque no itinera itinera por todos los días o porque no actualiza cont1 y cont 2.

¿Por qué declaras t y t1?

Muchas gracias!
  #6 (permalink)  
Antiguo 03/12/2008, 18:10
 
Fecha de Ingreso: diciembre-2008
Mensajes: 10
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Porcentaje condicional con agrupacion de fechas

Por si acaso no me he explicado bien, aquí dejo una mi consulta adapatada y el resultado de tuplas que he optenido:


SELECT DISTINCT anio, mes, dia, cont1, cont2, cont1 / ((cont1 + cont2) * 1.0) * 100 AS [%_si], cont2 / ((cont1 + cont2) * 1.0) * 100 AS [%_no]
FROM (SELECT YEAR(FechaRevision) AS anio, MONTH(FechaRevision) AS mes, DAY(FechaRevision) AS dia,
(SELECT COUNT(FirstCallResolution) AS Expr1
FROM Incident
WHERE (YEAR(FechaRevision) = YEAR(FechaRevision)) AND (MONTH(FechaRevision) = MONTH(FechaRevision)) AND
(DAY(FechaRevision) = DAY(FechaRevision)) AND (FirstCallResolution = 'si')) AS cont1,
(SELECT COUNT(FirstCallResolution) AS Expr1
FROM Incident AS Incident_2
WHERE (YEAR(FechaResolucion) = YEAR(FechaResolucion)) AND (MONTH(FechaResolucion) = MONTH(FechaResolucion)) AND
(DAY(FechaResolucion) = DAY(FechaResolucion)) AND (FirstCallResolution = 'no')) AS cont2
FROM Incident AS Incident_1) AS derivedtbl_1



RESULTADO
---------------
AÑO MES DIA cont1 cont2 %_si %_no
---- ---- ---- ------ ------- -------------------------- ------------------------
2007 4 2 719 2091 25,58718861209900 74,41281138790000
2007 4 7 719 2091 25,58718861209900 74,41281138790000
2007 4 19 719 2091 25,58718861209900 74,41281138790000



Un millón de gracias y perdonad por las molestias!
  #7 (permalink)  
Antiguo 04/12/2008, 07:49
 
Fecha de Ingreso: diciembre-2008
Mensajes: 10
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Porcentaje condicional con agrupacion de fechas

Ya conseguí adaptar mi código con la respuesta que me facilitó. Mi mayor dificultad era el poder comprender que con t1 y t, estaba trabajando con instancias diferentes de la misma tabla. Muchísimas gracias, me ha sido de grandísima ayuda.

Únicamente ahora tengo que hacer frente al problema de la division con 0, porque me da error. Podría ayudarme a encontrar una solución que no recurriesde de TRY y CATCH, teniendo en cuenta que hay registros null y algunos cuyos valores de Número de 'Si' = 0 = Nº de Noes??


Se lo agradezco enormemente!
  #8 (permalink)  
Antiguo 04/12/2008, 09:44
Avatar de Thumper  
Fecha de Ingreso: agosto-2004
Ubicación: Jesús María - Lima - Perú
Mensajes: 270
Antigüedad: 19 años, 8 meses
Puntos: 6
Respuesta: Porcentaje condicional con agrupacion de fechas

Hola Jesús, la única manera que te salga 0 en la parte de abajo es q para un dia se de:

Cantidad Si = 0
Cantidad No = 0

Podrias hacer lo siguiente:

Código sql:
Ver original
  1. DECLARE @TABLE TABLE ( fecha datetime, condicional CHAR(2))
  2.  
  3. INSERT INTO @TABLE VALUES( dateadd(DAY, -1, getdate()) , 'd' )
  4. INSERT INTO @TABLE VALUES( dateadd(DAY, -1, getdate()) , 'ns' )
  5. INSERT INTO @TABLE VALUES( dateadd(DAY, -1, getdate()) , 'f' )
  6.  
  7. SELECT DISTINCT *,
  8.     [%_si] = (cont1 / ((
  9.         CASE
  10.          WHEN cont1+cont2 = 0 THEN -1
  11.          ELSE cont1+cont2
  12.         END
  13.         ) * 1.0))*100,
  14.     [%_no] = (cont2 / ((
  15.         CASE
  16.          WHEN cont1+cont2 = 0 THEN -1
  17.          ELSE cont1+cont2
  18.         END
  19.         ) * 1.0))*100
  20. FROM (
  21. SELECT  anio = YEAR(t.fecha),
  22.     mes = MONTH(t.fecha),
  23.     dia = DAY(t.fecha),
  24.     cont1 = (SELECT COUNT(t1.condicional) FROM @TABLE t1
  25.          WHERE  YEAR(t1.fecha) = YEAR(t.fecha) AND  
  26.             MONTH(t1.fecha) = MONTH(t.fecha) AND
  27.             DAY(t1.fecha) = DAY(t.fecha) AND
  28.             condicional = 'si' ),
  29.     cont2 = (SELECT COUNT(t1.condicional) FROM @TABLE t1
  30.          WHERE  YEAR(t1.fecha) = YEAR(t.fecha) AND  
  31.             MONTH(t1.fecha) = MONTH(t.fecha) AND
  32.             DAY(t1.fecha) = DAY(t.fecha) AND
  33.             condicional = 'no' )    
  34. FROM @TABLE t ) xx

Por cierto en mi caso condicional es 'si' y 'no', si existen otros condicionales, por ejemplo cuando coloquen 0 es 'no' eso agregalo a los select cont1 y cont2 en la parte del where.
Saludos
__________________
Martín Alexis Valdivia S.
-----------------------------
"Quisiéramos cambiar el mundo, pero Dios no nos daría el código fuente." CAP
"Si Saber No Es Un Derecho, Seguro Será Un Izquierdo." WD
  #9 (permalink)  
Antiguo 04/12/2008, 10:47
 
Fecha de Ingreso: diciembre-2008
Mensajes: 10
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Porcentaje condicional con agrupacion de fechas

Gracias por las molestias Thumper!
La solución que me has propuesto es más "correcta" que la que se me acaba de ocurrir, pues al divisor le sumo un número realmente pequeño (0,00000001) que luego a la hora de hacer el redondeo se pierde.

Muchas gracias por todo!!!
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

SíEste tema le ha gustado a 1 personas




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