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

Consulta con Group by - Count(distinct)

Estas en el tema de Consulta con Group by - Count(distinct) en el foro de SQL Server en Foros del Web. buena que tal, me encuentro algo saturado despues de ver tantas querys .. Tengo una consulta, quizás alguno de uds ya paso por lo mismo. ...
  #1 (permalink)  
Antiguo 18/05/2015, 10:18
 
Fecha de Ingreso: febrero-2015
Mensajes: 89
Antigüedad: 9 años, 2 meses
Puntos: 1
Consulta con Group by - Count(distinct)

buena que tal, me encuentro algo saturado despues de ver tantas querys ..

Tengo una consulta, quizás alguno de uds ya paso por lo mismo.

Lo que deseo hacer es hacer un contador de llamadas por tipo de respuesta además contar de esa cantidad de llamadas cuantos fueros clientes distintos, algo asi:

tipo_rpta - cant_llamadas - cant_clientes
Acepto - 10 - 8
No Acepto - 20 - 14


Este es un ejemplo, lo cual ya me sale y todo bien. El detalle esta en que un cliente puede estar en cualquiera de los tipo de rpta, PORQ PUEDE DARSE QUE AL INICIO NO ACEPTO PERO LUEGO DE TANTO INSISTIR SI ACEPTO.

Entonces si yo hago un conteo general de la columna cant_clientes OBVIAMENTE voy a obtener un valor superior al real .. ya que el cliente puede repetirse x respuesta. Tengo claro que mi consulta con group by me muestra eso ya que lo agrupa...

Pero tienen alguna idea de como hacer que en cant cliente solo me tome en la suma el cliente que acepto.

Es decir si el cliente tiene 2 tipo de rpta, que solo cuente la mejor respuesta! entonces quedaria algo asi: (suponiendo que solo un cliente tubo ambas respuestas).


tipo_rpta - cant_llamadas - cant_clientes
Acepto - 10 - 8
No Acepto - 20 - 13
  #2 (permalink)  
Antiguo 18/05/2015, 12:45
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Consulta con Group by - Count(distinct)

Bueno, yo haría DOS GRUPOS, los que NO ACEPTARON y los que SI ACEPTARON, después eliminaría de los QUE NO ACEPTARON, todos aquellos que están en el grupo de SI ACEPTARON.

Listo
__________________
MCTS Isaias Islas
  #3 (permalink)  
Antiguo 18/05/2015, 13:13
 
Fecha de Ingreso: febrero-2015
Mensajes: 89
Antigüedad: 9 años, 2 meses
Puntos: 1
Respuesta: Consulta con Group by - Count(distinct)

Cita:
Iniciado por iislas Ver Mensaje
Bueno, yo haría DOS GRUPOS, los que NO ACEPTARON y los que SI ACEPTARON, después eliminaría de los QUE NO ACEPTARON, todos aquellos que están en el grupo de SI ACEPTARON.

Listo
Gracias por la respuesta iislas, pensé lo mismo... el problema es que en realidad son N tipos de respuesta .. y hacer eso por cada 1 :/.... las que yo puse solo eran de un ejemplo en general.

Además es posible que estas respuestas incrementen o cambien.. este sera parte de un proceso parte de una ETL. trato de hacerlo lo más dinamico posible :&.
  #4 (permalink)  
Antiguo 18/05/2015, 13:24
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta con Group by - Count(distinct)

entonces no estas explicando todo tu scenario, trata de explicarlo mejor.....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 18/05/2015, 14:37
 
Fecha de Ingreso: febrero-2015
Mensajes: 89
Antigüedad: 9 años, 2 meses
Puntos: 1
Respuesta: Consulta con Group by - Count(distinct)

Ok, trate de resumirlo de esa forma.

Bueno lo que sucede es que necesito agrupar cantidad_llamadas y cantidad_clientes por tipo de respuesta.

Es decir... tendré una muestra de 100 registros donde tengo 50 (Clientes unicos) (100 llamadas en total) los agrupo por tipo llamada y me sale lo siguiente.

Tipo_respuesta - cant_llamada, cant_clientes
No contesta 20 - 15
Responde tecero 25 - 20
Apagado 35 - 20
Compromiso d pago 20 - 10

La consulta que hago es basica:

Código SQL:
Ver original
  1. SELECT tipo_rpta, COUNT(llamada), COUNT(DISTINCT id_cliente) AS cant_clientes FROM llamadas
  2. GROUP BY  tipo_rpta

El detalle esta en que si yo quiero sumar la cantidad de clientes en total llamados me va salir 65... apesar que deberían ser 50. OBVIAMENTE me sale 65 porque estoy agrupando y es posible que un cliente tenga varios tipos de respuesta. pero lo que yo deseo hacer es .. buscar la manera en que los clientes solo sean contados 1 vez por respuesta (la mejor respuesta). para eso se tiene una tabla que evalua los pesos de cada respuesta, es decir sumando todo debería salir 50. Quedaría algo asi ... imaginando:

Tipo_respuesta - cant_llamada, cant_clientes
No contesta 20 - 10
Responde tecero 25 - 15
Apagado 35 - 15
Compromiso d pago 20 - 10


Ya que los clientes que estan en otro estado solo se sumaran en la mejor respeusta q tengan.
  #6 (permalink)  
Antiguo 18/05/2015, 15:34
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Consulta con Group by - Count(distinct)

Dos grupos, la MEJOR RESPUESTA y las "otras", DESCRIMINAS aquellos que estén en la mejor respuesta de las otras
__________________
MCTS Isaias Islas
  #7 (permalink)  
Antiguo 18/05/2015, 16:57
 
Fecha de Ingreso: febrero-2015
Mensajes: 89
Antigüedad: 9 años, 2 meses
Puntos: 1
Respuesta: Consulta con Group by - Count(distinct)

Cita:
Iniciado por iislas Ver Mensaje
Dos grupos, la MEJOR RESPUESTA y las "otras", DESCRIMINAS aquellos que estén en la mejor respuesta de las otras
Por lo que entiendo es que tengo que hacer una subconsulta quitando los registros que no estan dentro del grupo mejor respuesta. y con eso hacer un count. no se si funcionará bien ponerlo dentro de una consulta grande con millones de datos me refiero al tiempo de respuesta.

de todas formas creo que di con algo despues de tanto pensar. estaré validandolo de todas formas lo dejo para ver que piensan si se pone algo como esto:

Código SQL:
Ver original
  1. COUNT(DISTINCT CASE WHEN fs.peso >= z.peso THEN d.codigo_cliente END )

Cabe resaltar que debajo de eso hubo una consulta obteniendo el maximo peso de la respuesta x cliente etc....

. saludos,
  #8 (permalink)  
Antiguo 23/05/2015, 03:25
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años
Puntos: 31
Respuesta: Consulta con Group by - Count(distinct)

Para tu primer caso de ejemplo:

tipo_rpta - cant_llamadas - cant_clientes
Acepto - 10 - 8
No Acepto - 20 - 14

Tienes que ir cliente a cliente, viendo qué tipo de respuestas ha obtenido, y de todos los tipos cual es la que se repite más.

Select tipo_rpta, cant_llamadas,cant_clientes
from mitabla
where tipo_rpta=(select max(distinct(tipo_rpta)) from mitabla)

De todas formas... no se qué tipo de datos son los que quieres sacar, si es el resultado de la llamada lo que importa, o si es el resultado final para cada caso de cada cliente.
A mí me da igual si yo llamo para pedir un móvil de 800€ gratis a mi compañía de teléfonos y me dicen que no 50 veces, si a la 51 me dicen que si. La que a mí me cuenta es la última. Ya que después de esa ya no voy a hacer más.

Última edición por Kritik; 23/05/2015 a las 03:35
  #9 (permalink)  
Antiguo 25/05/2015, 08:36
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta con Group by - Count(distinct)

un ejemplo de tus datos y lo que quieres obtener ayudaria mucho
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: group
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 19:04.