Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
Resolución Parciales SQL, dudas
Autor Mensaje
Fly Sin conexión
Secretario de la SAE
estado sólido
******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 558
Agradecimientos dados: 119
Agradecimientos: 186 en 61 posts
Registro en: May 2011
Mensaje: #1
Resolución Parciales SQL, dudas Parciales Gestión de Datos
Como va?
En el primer recuperatorio de Reinosa nos tomaron este Ejercicio de SQL que me gustaría compartir:

EJERCICIO 1, RECUPERATORIO 08/07/2014
Escriba una consulta SQL que retorne un ranking de los mejores 3 empleados del 2012.
Se deberá retornar legajo, nombre y apellido, año de ingreso, puntaje 2011, puntaje 2012.
El puntaje de cada empleado se calculará de la siguiente manera:
Para los que hayan vendido al menos 10 facturas el puntaje se calculará como la cantidad de facturas
que superen los 100 pesos que haya vendido en el año, para los que tengan menos de 10 facturas
en el año el cálculo del puntaje será el 50% de cantidad de facturas realizadas por sus
subordinados directos en dicho año.

.... yo quería resolverlo usando IFs, pero ahí recordé que no existen los IFs fuera de Transact, pero al mismo tiempo me olvidé del uso de CASEs.... Así que se me ocurrió resolverlo de la siguiente forma usando Sumas:


SELECT TOP 3
empl_codigo AS Legajo
, empl_nombre
, empl_apellido
, YEAR(empl_ingreso) as AnioIngreso
,
(
SELECT COUNT(fact_tipo)
FROM facultad.dbo.Factura
WHERE
fact_vendedor = empl_codigo
AND
fact_total > 100
AND
YEAR(fact_fecha) = 2011
AND
COUNT(F1.fact_tipo) >= 10

)
+(
SELECT COUNT(fact_tipo)/2
FROM
facultad.dbo.Factura
, facultad.dbo.Empleado E2
WHERE
E2.empl_jefe = E.empl_codigo
AND
fact_vendedor = E2.empl_codigo
AND
YEAR(fact_fecha) = 2011
AND
COUNT(F1.fact_tipo) < 10
) AS Puntaje2011

, (
SELECT COUNT(fact_tipo)
FROM facultad.dbo.Factura
WHERE
fact_vendedor = empl_codigo
AND
fact_total > 100
AND
YEAR(fact_fecha) = 2012
AND
COUNT(F1.fact_tipo) >= 10
)
+(
SELECT COUNT(fact_tipo)/2
FROM
facultad.dbo.Factura
, facultad.dbo.Empleado E2
WHERE
E2.empl_jefe = E.empl_codigo
AND
fact_vendedor = E2.empl_codigo
AND
YEAR(fact_fecha) = 2012
AND
COUNT(F1.fact_tipo) < 10
) AS Puntaje2012

FROM
facultad.dbo.Empleado E
, facultad.dbo.Factura F1
WHERE
fact_vendedor = empl_codigo
AND
YEAR(F1.fact_fecha) = 2012

GROUP BY
empl_codigo
, empl_nombre
, empl_apellido
, empl_ingreso
ORDER BY
Puntaje2012 DESC


... Aprobé con un 4 roñoso, pero me quedé con las dudas de cuál es la mejor forma de resolver esto.. ¿alguna sugerencia?
20-07-2014 16:56
Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
gonnza Sin conexión
User Verde

*********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 17.262
Agradecimientos dados: 780
Agradecimientos: 785 en 328 posts
Registro en: Mar 2010
BlogSpot Google+ YouTube
Mensaje: #2
RE: Resolución Parciales SQL, dudas
ojo que el operador Top no es ansi, es de T-sql..

[Imagen: v34BEFt.gif]
20-07-2014 17:17
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Dem0 Sin conexión
( ͡° ͜ʖ ͡°)
._.
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 4.984
Agradecimientos dados: 9
Agradecimientos: 161 en 67 posts
Registro en: Apr 2008
Mensaje: #3
RE: Resolución Parciales SQL, dudas
CASE es ANSI.

Si la relación jefes-subordinados es un árbol se puede resolver con una sola query con N tablas Empleado en el join, una por cada nivel del árbol.

Si entendí bien el ejercicio, podés hacer (Empleado inner join Factura) E1 y left outer join con (Empleado inner join Factura) E2, agregando/reduciendo (group by) por empelado E1 y joineando E2 por ID de supervisor. Sumarizas todo en diferentes THEN del CASE, y los WHEN son las condiciones de qué mostrar.
(Este mensaje fue modificado por última vez en: 20-07-2014 22:32 por Dem0.)
20-07-2014 22:30
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
gonnza Sin conexión
User Verde

*********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 17.262
Agradecimientos dados: 780
Agradecimientos: 785 en 328 posts
Registro en: Mar 2010
BlogSpot Google+ YouTube
Mensaje: #4
RE: Resolución Parciales SQL, dudas
Eso mostraria todos los empleados, necesitas 3

Y TOP no es ansi..

[Imagen: v34BEFt.gif]
21-07-2014 01:12
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Fly Sin conexión
Secretario de la SAE
estado sólido
******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 558
Agradecimientos dados: 119
Agradecimientos: 186 en 61 posts
Registro en: May 2011
Mensaje: #5
RE: Resolución Parciales SQL, dudas
OK, si supuestamente no puedo usar TOP, ¿qué podría usar para hacer un limit de 3?
Hasta donde yo sepa no hay problemas con usar TOP en los parciales.
21-07-2014 11:49
Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
gonnza Sin conexión
User Verde

*********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 17.262
Agradecimientos dados: 780
Agradecimientos: 785 en 328 posts
Registro en: Mar 2010
BlogSpot Google+ YouTube
Mensaje: #6
RE: Resolución Parciales SQL, dudas

Off-topic:
entonces les enseñan algo que no es =P

[Imagen: v34BEFt.gif]
21-07-2014 11:52
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Dem0 Sin conexión
( ͡° ͜ʖ ͡°)
._.
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 4.984
Agradecimientos dados: 9
Agradecimientos: 161 en 67 posts
Registro en: Apr 2008
Mensaje: #7
RE: Resolución Parciales SQL, dudas
(21-07-2014 11:49)Fly escribió:  OK, si supuestamente no puedo usar TOP, ¿qué podría usar para hacer un limit de 3?
Hasta donde yo sepa no hay problemas con usar TOP en los parciales.

fetch first 3 rows only

es ansi.
21-07-2014 19:23
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Buscar en el tema
Enviar respuesta 




Usuario(s) navegando en este tema: 1 invitado(s)



    This forum uses Lukasz Tkacz MyBB addons.