elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el ttwitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  Bases de Datos (Moderador: Carloswaldo)
| | | |-+  ¿Selecionar el Max() de una función Count()?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: ¿Selecionar el Max() de una función Count()?  (Leído 7,092 veces)
DanteInfernum

Desconectado Desconectado

Mensajes: 60


Ver Perfil
¿Selecionar el Max() de una función Count()?
« en: 13 Octubre 2013, 18:15 »

El problema es el siguiente:

Tengo una tabla Seguros con todos los seguros vendidos por los vendedores.
Quiero seleccionar el(o los) vendedor(es) que más seguros haya(n) vendido.
Para esto, averiguo cuantos seguros ha vendido cada vendedor:

Código
  1. SELECT COUNT(*)
  2. FROM seguros
  3. GROUP BY vendedor

¿Y ahora? ¿Cómo selecciono el o los valores máximos de esta consulta?
Tendría que encontrar algo similar a Max(Count(*)) (cosa que no existe en SQL)

Estoy usando SQL Server.


En línea

xustyx

Desconectado Desconectado

Mensajes: 213


Ver Perfil
Re: ¿Selecionar el Max() de una función Count()?
« Respuesta #1 en: 13 Octubre 2013, 18:19 »

Con una subconsulta


En línea

DanteInfernum

Desconectado Desconectado

Mensajes: 60


Ver Perfil
Re: ¿Selecionar el Max() de una función Count()?
« Respuesta #2 en: 13 Octubre 2013, 20:17 »

Claro, me imagino que por ahí debe de venir la mano, pero hasta ahora no termino de dar con la solución usando subconsultas.

Una solución "parche" podría ser:
Código
  1. SELECT TOP 1 COUNT(*)
  2. FROM seguros
  3. GROUP BY vendedor
  4. ORDER BY COUNT(*) DESC

Esto es, cuento la cantidad de seguros vendidos por cada corredor, los ordeno de mayor a menor, y selecciono el primero de ellos.
El problema con esto es que de esta forma selecciono solo un valor máximo. Si varios vendedores llegan a este mismo máximo de ventas, solo vería la información de uno de ellos.
« Última modificación: 23 Octubre 2013, 22:41 por DanteInfernum » En línea

DanteInfernum

Desconectado Desconectado

Mensajes: 60


Ver Perfil
Re: ¿Selecionar el Max() de una función Count()?
« Respuesta #3 en: 13 Octubre 2013, 23:40 »

¡La solución! (Al menos en T-SQL)

Código
  1. SELECT TOP 1 WITH TIES COUNT(*)
  2. FROM seguros
  3. GROUP BY vendedor
  4. ORDER BY COUNT(*) DESC

La clave está en SELECT TOP WITH TIES, de esta forma me devuelve todos los registros que tienen un mismo valor.
Igual me gustaría saber de otras formas de conseguir esto mismo. Me quedo con la sensasión de estar haciendo trampa... ¿Cómo podría hacerlo dentro del estándar de SQL?
En línea

1mpuls0


Desconectado Desconectado

Mensajes: 1.186


Ver Perfil
Re: ¿Selecionar el Max() de una función Count()?
« Respuesta #4 en: 16 Octubre 2013, 23:57 »

Código
  1. CREATE TABLE [dbo].[Seguros](
  2. [seguro_folio] [INT] NOT NULL,
  3. [vendedor_fk] [INT] NOT NULL
  4. ) ON [PRIMARY]
  5. GO
  6.  

Código
  1. INSERT [dbo].[Seguros] ([seguro_folio], [vendedor_fk]) VALUES (111, 1)
  2. INSERT [dbo].[Seguros] ([seguro_folio], [vendedor_fk]) VALUES (121, 1)
  3. INSERT [dbo].[Seguros] ([seguro_folio], [vendedor_fk]) VALUES (122, 1)
  4. INSERT [dbo].[Seguros] ([seguro_folio], [vendedor_fk]) VALUES (333, 2)
  5. INSERT [dbo].[Seguros] ([seguro_folio], [vendedor_fk]) VALUES (555, 3)
  6. INSERT [dbo].[Seguros] ([seguro_folio], [vendedor_fk]) VALUES (777, 3)
  7. INSERT [dbo].[Seguros] ([seguro_folio], [vendedor_fk]) VALUES (999, 4)
  8. INSERT [dbo].[Seguros] ([seguro_folio], [vendedor_fk]) VALUES (888, 4)
  9.  

Código
  1. SELECT * FROM
  2. (SELECT DISTINCT TOP(2) *
  3. FROM (
  4. SELECT COUNT(*) AS ventas FROM dbo.Seguros
  5. GROUP BY vendedor_fk) AS V
  6. ORDER BY V.ventas DESC) AS M
  7. INNER JOIN
  8. (SELECT COUNT(*) AS ventas, vendedor_fk FROM dbo.Seguros
  9. GROUP BY vendedor_fk) AS  T
  10. ON M.ventas=T.ventas
  11.  
En línea

abc
DanteInfernum

Desconectado Desconectado

Mensajes: 60


Ver Perfil
Re: ¿Selecionar el Max() de una función Count()?
« Respuesta #5 en: 22 Octubre 2013, 20:48 »

Gracias por haberte tomado el trabajo de hasta crear una tabla de ejemplo y todo. Tu código me sirvió más que nada para ver que también puedo utilizar subconsultas en la cláusula FROM. Sólo había visto esto en ejemplos de MySQL y pensaba que no iba a funcionar en SQL Server.
Igual no termino de entender que hiciste; me confunde la parte de "SELECT DISTINCT TOP(2)".

Acá dejo otra forma que anduve estudiando de hacer lo mismo, esta vez usando CTE (common table expression)
(usando tu misma tabla)
Código
  1. WITH ventasTotales
  2. AS
  3. (
  4. SELECT vendedor_fk, COUNT(*) AS total
  5. FROM seguros
  6. GROUP BY vendedor_fk
  7. )
  8. SELECT *
  9. FROM ventasTotales
  10. WHERE total = (SELECT MAX(total) FROM ventasTotales)
  11.  

De esta forma puedo almacenar la cantidad de ventas de cada vendedor (usando Count() ) en una tabla temporal, y luego puedo hacer referencia a ella para seleccionar cuál es el o los vendedores con mayor número de ventas (usando Max() ).
Y de esta forma obtengo el Max(Count()) que tantos problemas me estaba dando.
« Última modificación: 22 Octubre 2013, 20:52 por DanteInfernum » En línea

DanteInfernum

Desconectado Desconectado

Mensajes: 60


Ver Perfil
Re: ¿Selecionar el Max() de una función Count()?
« Respuesta #6 en: 22 Octubre 2013, 21:07 »

Antes había intentado otra forma de hacer todo esto, pero me da un error que no termino de comprender a qué se debe.

Lo que hice fue encarar el problema usando una tabla derivada. Por lo que leí, entiendo que una tabla derivada no es nada más que una subconsulta dentro de una cláusula FROM a la cual estoy obligado a darle un alias.

Bien, acá está mi intento:
Código
  1. SELECT *
  2. FROM(
  3. SELECT vendedor_fk, COUNT(*) AS total
  4. FROM seguros
  5. GROUP BY vendedor_fk
  6. ) AS ventasTotales
  7. WHERE total = (SELECT MAX(total) FROM ventasTotales)
  8.  

Sin embargo, me da el siguiente error: El nombre de objeto 'ventasTotales' no es válido.
¿Alguna pista? ¿Si no puedo hacer referencia a la tabla derivada, aún sin salir de la consulta original, para qué el requisito de darle un alias?
En línea

1mpuls0


Desconectado Desconectado

Mensajes: 1.186


Ver Perfil
Re: ¿Selecionar el Max() de una función Count()?
« Respuesta #7 en: 22 Octubre 2013, 21:35 »

De nada.

Código
  1.  
  2.  
  3. /*Selecciona el total de las ventas por cada vendedor*/
  4. SELECT COUNT(*) AS ventas FROM dbo.Seguros
  5. GROUP BY vendedor_fk
  6.  
  7. /*Selecciona solo los primeros 2 ventas más grandes */
  8. SELECT DISTINCT TOP(2) *
  9. FROM ( SELECT COUNT(*) AS ventas FROM dbo.Seguros GROUP BY vendedor_fk) AS V
  10. ORDER BY V.ventas DESC
  11.  
  12. /*Selecciona todos los vendedores y sus ventas*/
  13. SELECT COUNT(*) AS ventas, vendedor_fk FROM dbo.Seguros
  14. GROUP BY vendedor_fk
  15.  
  16. /*Se utiliza un Inner Join para unir las consultas que contiene las cantidades más grandes de ventas y el total de vendedores (con su total de ventas)*/
  17.  
  18.  


Si me das oportunidad en la noche verifico tu consulta para resolver el problema.

Saludos.
En línea

abc
1mpuls0


Desconectado Desconectado

Mensajes: 1.186


Ver Perfil
Re: ¿Selecionar el Max() de una función Count()?
« Respuesta #8 en: 23 Octubre 2013, 23:54 »

¿Alguna pista? ¿Si no puedo hacer referencia a la tabla derivada, aún sin salir de la consulta original, para qué el requisito de darle un alias?

Porque es una subconsulta, es decir una consulta se encuentra dentro de otra.
El hecho de que le tengas que asiganar u alias te sirve para poder utilizar union, inner join y otras funciones.

Lo que no entiendo es para que utilizas
SELECT MAX(total) FROM ventasTotales

Pensé que querías los N ventas más grandes por eso yo utilzo
SELECT DISTINCT TOP(2) *
FROM ( SELECT COUNT(*) AS ventas FROM dbo.Seguros GROUP BY vendedor_fk) AS V
ORDER BY V.ventas DESC

Saludos.

En línea

abc
DanteInfernum

Desconectado Desconectado

Mensajes: 60


Ver Perfil
Re: ¿Selecionar el Max() de una función Count()?
« Respuesta #9 en: 24 Octubre 2013, 18:15 »

Sí, ahora que lo releo, puede ser que haya sido medio confusa la manera en la que lo escribí.
Lo que quiero es el vendedor con mayor número de ventas.
Por eso hago primero:
Código
  1. SELECT vendedor_fk, COUNT(*) AS total
  2. FROM seguros
  3. GROUP BY vendedor_fk
  4.  

Con esto tengo una tabla (ventasTotales) con la cantidad de ventas de todos los vendedores, y después con MAX(total) FROM ventasTotales selecciono al que tiene el mayor número.
El problema está en que puede ser que más de un vendedor haya llegado a esta cantidad máxima de ventas, y yo quiero selecionarlos a todos ellos (a todos los que hayan llegado al máximo de ventas, y no las N ventas más grandes)

Por esto hago:
WHERE total = (SELECT MAX(total) FROM ventasTotales)
Así selecciono a todos los vendedores que llegaron a la cantidad máxima.

En el caso del ejemplo, el vendedor con mayor número de ventas es el
vendedor número 1 con un total de 3 ventas.

Si el vendedor número 4 hiciera una venta más, entonces el resultado sería:
vendedor número 1 y vendedor número 4 con un total de 3 ventas cada uno.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Argument count
PHP
Wdeah 2 1,246 Último mensaje 17 Diciembre 2006, 23:32
por Ertai
User Count v.1.0.1
Scripting
.Undertaker. 0 1,281 Último mensaje 23 Septiembre 2007, 23:15
por .Undertaker.
selecionar un boton
Java
sapito169 3 1,966 Último mensaje 28 Agosto 2008, 16:12
por Sk9ITk5Z
Forms.count [DUDA]
Programación Visual Basic
.:BlackCoder:. 2 1,740 Último mensaje 4 Junio 2010, 08:52
por .:BlackCoder:.
selecionar el ultimo id creado en otra query
Bases de Datos
gAb1 4 1,849 Último mensaje 30 Agosto 2013, 03:16
por gAb1
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines