Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - DanteInfernum

#41
Que dos tablas estén relacionadas entre si significa que una de ellas tiene una clave foránea que referencia a la clave principal de la otra.

No creo que sirvan para algo más que para prevenir posibles errores de integridad referencial como bien dijiste.

Pero, como dice el dicho: ¡Más vale prevenir que curar!
Así que siempre es bueno usar relaciones.
#42
Foro Libre / Re: internet en la luna
26 Octubre 2013, 00:36 AM
Aparte que los astronautas son seres humanos (¡aunque usted no lo crea!) y también se aburren. ;D
Ahora durante el recreo pueden perder el tiempo tranquilamente en Facebook.

Yo me apunto para ver un partidito de Moonball  :D
#43
Sí, es eso mismo. Gracias por todo.

Me gusta el hecho de que no utilizas ninguna sentencia especial en tu cógido. Eso es bueno para tener una idea más clara de qué es lo que realmente se está haciendo. Ahora entiendo mucho mejor dónde puedo utilizar las subconsultas y para qué sirve darles un alias.

Saludos.
#44
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 (sql) [Seleccionar]

SELECT vendedor_fk, COUNT(*) AS total
FROM seguros
GROUP BY vendedor_fk


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.
#45
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 (sql) [Seleccionar]

SELECT *
FROM(
SELECT vendedor_fk, Count(*) AS total
FROM seguros
GROUP BY vendedor_fk
) AS ventasTotales
WHERE total = (SELECT Max(total) FROM ventasTotales)


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?
#46
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 (sql) [Seleccionar]

WITH ventasTotales
AS
(
SELECT vendedor_fk, Count(*) AS total
FROM seguros
GROUP BY vendedor_fk
)
SELECT *
FROM ventasTotales
WHERE total = (SELECT Max(total) FROM ventasTotales)


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.
#47
¡La solución! (Al menos en T-SQL)

Código (sql) [Seleccionar]
SELECT TOP 1 WITH TIES Count(*)
FROM seguros
GROUP BY vendedor
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?
#48
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 (sql) [Seleccionar]
SELECT TOP 1 Count(*)
FROM seguros
GROUP BY vendedor
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.
#49
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 (sql) [Seleccionar]
SELECT Count(*)
FROM seguros
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.
#50
¡Encontré la solución!

Resulta que la variable @@error cambia constantemente de valor. Específicamente, se modifica cada vez que se ejecuta una sentencia. En este caso, si bien se produce un error al insertar el registro, luego la sentencia IF se ejecuta sin problema alguno, de ahí que el valor de @@error se reinicializa a 0.
Lo que hay que hacer para evitar esto, es guardar el valor de @@error en una variable.

Código (sql) [Seleccionar]

ALTER PROCEDURE proc4
@idSeccion nchar(3),
@descripcion varchar(20)
AS
BEGIN
DECLARE @error int
INSERT INTO Secciones
VALUES(@idSeccion, @descripcion)
SET @error = @@ERROR
IF @error <> 0
BEGIN
RETURN @error
END
ELSE
BEGIN
RETURN 1
END
END