UTNianos

Versión completa: Resolución Parciales SQL, dudas
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
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?
ojo que el operador Top no es ansi, es de T-sql..
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.
Eso mostraria todos los empleados, necesitas 3

Y TOP no es ansi..
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.

Off-topic:
entonces les enseñan algo que no es =P
(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.
URLs de referencia