UTNianos

Versión completa: [Aporte] Final GDD 13/10/2020
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas, dejo la parte escrita del final tomado el 13/10/2020.

Se compone de 2 VoF, 1 práctico Multiple Choice y 1 ejercicio práctico a desarrollar.

1) La implementación de un hash permite obtener a partir de una entrada "x" una salida "y" única y reversible (FALSO)
2) Si un árbol binario es completo, entonces la cantidad de nodos que posee es impar (VERDADERO)

3) [Imagen: unknown.png]

4) [Imagen: unknown.png]

En este yo hice dos triggers distintos (uno para INSERT y otro para DELETE), pero me hizo las siguientes anotaciones:
  • Hay que usar un GETDATE() para obtener la fecha para la tabla de auditorías
  • Se puede hacer 1 solo trigger que pregunte si tiene datos la tabla INSERTED o DELETED

Saludos
hola, hubo alguna parte Oral ? o solamente escrito? gracias
(13-10-2020 21:53)heinn escribió: [ -> ]hola, hubo alguna parte Oral ? o solamente escrito? gracias

Buenas, los que aprobaron esta parte escrita mañana rinden la parte oral. Aparentemente son menos de 15 minutos por estudiante.

Saludos
Final 13/10/2020
--------------------------

El objetivo de un Datawarehouse es aglutinar información de diferentes orígenes de datos para obtener información en la toma de decisiones
RTA: VERDADERO

--------------------------

Cuando un grafo no es unívoco, debe ser categorizado como un Grafo Irrestricto
RTA: VERDADERO

--------------------------
Dada la tablas clientes con el campo clie_codigo definido como primary key
select count(*) C1 ,count(clie_codigo)C2 ,count(distinct clie_codigo)C3 from cliente
Indique cual sería el resultado

Seleccione una:
a. C1=C2=C3
b. Ninguna de las anteriores
c. C1=C2 y C3<>C2
d. C1>=C2 y C2>=C3
e. C1>C2 y C2>=C3
f. C1>C2 y C2>C3

RTA: A) C1 = C2 = C3


--------------------------

[attachment=19481]

Realizar una consulta que devuelva para todos los entrenadores

Apellido y Nombre, Apellido y nombre de quien lo entrena, Cantidad de especialidades del entrenador, cantidad de especialidades de quien lo entrena, cantidad total de horas semanales del entrenador y cantidad total de quien lo entrena. Ninguna de las 5 columnas solicitadas deberán mostrarse en NULL. En caso de no tener un entrenador asociado mostrar “No posee entrenador”


RTA POCO OPTIMA

SELECT
(e1.entr_apellido + ' ' + e1.entr_nombre) as "Apellido y Nombre",

ISNULL((SELECT (entr_apellido + ' ' + entr_nombre) FROM Entrenador WHERE entr_id = e1.entrenado_por_id), 'No posee entrenador') AS "Apellido y Nombre de su entrenador",
(SELECT COUNT(*) FROM Entrenador_Especialidad WHERE enes_entrenador_id = e1.entr_id) AS "Cantidad especialidades",
(SELECT COUNT(*) FROM Entrenador_Especialidad WHERE enes_entrenador_id = e1.entrenado_por_id) AS "Cantidad especialidades de su entrenador",
ISNULL((SELECT SUM(enes_hs_semanales) FROM Entrenador_Especialidad WHERE enes_entrenador_id = e1.entr_id), 0) AS "Cantidad Total de horas semanales",
ISNULL((SELECT SUM(enes_hs_semanales) FROM Entrenador_Especialidad WHERE enes_entrenador_id = e1.entrenado_por_id), 0) AS "Cantidad Total de horas semanales del entrenador"
FROM
Entrenador AS e1


RTA MAS OPTIMA

SELECT
(e1.entr_apellido + ' ' + e1.entr_nombre) as "Apellido y Nombre",
COUNT(ee1.enes_entrenador_id) AS "Cantidad especialidades",
ISNULL(SUM(ee1.enes_hs_semanales), 0) AS "Cantidad Total de horas semanales",
-- Datos entrenador padre
ISNULL((e2.entr_apellido + ' ' + e2.entr_nombre), 'No posee entrenador') as "Apellido y Nombre del entrenador",
ISNULL(COUNT(ee2.enes_entrenador_id), 0) AS "Cantidad especialidades del entrenador",
ISNULL(SUM(ee2.enes_hs_semanales), 0) AS "Cantidad Total de horas semanales del entrenador"
FROM
Entrenador AS e1
LEFT JOIN Entrenador_Especialidad as ee1 ON e1.entr_id = ee1.enes_entrenador_id
LEFT JOIN Entrenador_Especialidad as ee2 ON e1.entrenado_por_id = ee2.enes_entrenador_id
LEFT JOIN Entrenador as e2 ON e1.entrenado_por_id = e2.entr_id
GROUP BY e1.entr_id, e1.entr_nombre, e1.entr_apellido, e1.entrenado_por_id, e2.entr_id, e2.entr_nombre, e2.entr_apellido




------

En el oral me tomaron:

- Modelo ANSI/SPARC (No la pude responder porque no me acordaba que se llamaba ANSI/SPARC, la tenia como modelo de arquitectura del motor de base de datos)
- Describir los diferentes tipos de aislamientos
- Concepto, funcionalidad y que aportan las vistas
Buenas loqmolesta2, hasta donde tenia entendido, en los parciales te dejaban utilizar a lo sumo una subquery. En el ejercicio que mostrars una de las respuestas tiene 4. Te lo toman como valido igual?
(21-12-2020 12:12)gonzalo.l escribió: [ -> ]Buenas loqmolesta2, hasta donde tenia entendido, en los parciales te dejaban utilizar a lo sumo una subquery. En el ejercicio que mostrar, una de las respuestas tiene 4. Te lo toman como valido igual?

Hola,
Si, como el enunciado no decía nada, podías hacerlo como querías, me lo tomaron como 100% valido sin aclaración

Saludos
(21-12-2020 12:39)loqmolesta2 escribió: [ -> ]
(21-12-2020 12:12)gonzalo.l escribió: [ -> ]Buenas loqmolesta2, hasta donde tenia entendido, en los parciales te dejaban utilizar a lo sumo una subquery. En el ejercicio que mostrar, una de las respuestas tiene 4. Te lo toman como valido igual?

Hola,
Si, como el enunciado no decía nada, podías hacerlo como querías, me lo tomaron como 100% valido sin aclaración

Saludos

Otra cosa, la respuesta mas optima es erronea. La clausula group by tiene mal las columnas sobre las que tiene que agrupar. En este enlace esta la explicación: https://www.campusmvp.es/recursos/post/F...acion.aspx
Mas concretamente :
"Es muy importante tener en cuenta que cuando utilizamos la cláusula GROUP BY, los únicos campos que podemos incluir en el SELECT sin que estén dentro de una función de agregación, son los que vayan especificados en el GROUP BY."
En la query, eso no se cumple. La query que seria la "optima" (que hasta donde entendia yo era la unica respuesta que tomaba como valida a la catedra ya que las subquerys no son performantes, cosa que perece que cambio) es:

SELECT E1.entr_nombre + ' ' E1.entr_appellido, ISNULL(E2.entr_nombre + ' ' + E2.entr_appellido, 'No posee entrenador'), ISNULL(COUNT(EE1.enes_especialidad_id), 'No posee entrenador'), ISNULL(COUNT(EE2.enes_especialidad_id), 'No posee entrenador'), ISNULL(SUM(EE1.enes_hs_semanales), 'No posee entrenador'), ISNULL(SUM(EE2.enes_hs_semanales), 'No posee entrenador')
FROM
Entrenador E1
LEFT OUTER JOIN Entrador E2 ON E1.entr_id=E1.entr_id
LEFT OUTER JOIN Entrador_Especialidad EE1 on E1.entr_id=EE1.enes_entrenador_id
LEFT OUTER JOIN Entrador_Especialidad EE2 on E2.entr_id=EE2.enes_entrenador_id
GROUP BY E1.entr_nombre + ' ' E1.entr_appellido, ISNULL(E2.entr_nombre + ' ' + E2.entr_appellido, 'No posee entrenador')
(21-12-2020 12:41)gonzalo.l escribió: [ -> ]
(21-12-2020 12:39)loqmolesta2 escribió: [ -> ]
(21-12-2020 12:12)gonzalo.l escribió: [ -> ]Buenas loqmolesta2, hasta donde tenia entendido, en los parciales te dejaban utilizar a lo sumo una subquery. En el ejercicio que mostrar, una de las respuestas tiene 4. Te lo toman como valido igual?

Hola,
Si, como el enunciado no decía nada, podías hacerlo como querías, me lo tomaron como 100% valido sin aclaración

Saludos

Otra cosa, la respuesta mas optima es erronea. La clausula group by tiene mal las columnas sobre las que tiene que agrupar. En este enlace esta la explicación: https://www.campusmvp.es/recursos/post/F...acion.aspx
Mas concretamente :
"Es muy importante tener en cuenta que cuando utilizamos la cláusula GROUP BY, los únicos campos que podemos incluir en el SELECT sin que estén dentro de una función de agregación, son los que vayan especificados en el GROUP BY."
En la query, eso no se cumple. La query que seria la "optima" (que hasta donde entendia yo era la unica respuesta que tomaba como valida a la catedra ya que las subquerys no son performantes, cosa que perece que cambio) es:

SELECT E1.entr_nombre + ' ' E1.entr_appellido, ISNULL(E2.entr_nombre + ' ' + E2.entr_appellido, 'No posee entrenador'), ISNULL(COUNT(EE1.enes_especialidad_id), 'No posee entrenador'), ISNULL(COUNT(EE2.enes_especialidad_id), 'No posee entrenador'), ISNULL(SUM(EE1.enes_hs_semanales), 'No posee entrenador'), ISNULL(SUM(EE2.enes_hs_semanales), 'No posee entrenador')
FROM
Entrenador E1
LEFT OUTER JOIN Entrador E2 ON E1.entr_id=E1.entr_id
LEFT OUTER JOIN Entrador_Especialidad EE1 on E1.entr_id=EE1.enes_entrenador_id
LEFT OUTER JOIN Entrador_Especialidad EE2 on E2.entr_id=EE2.enes_entrenador_id
GROUP BY E1.entr_nombre + ' ' E1.entr_appellido, ISNULL(E2.entr_nombre + ' ' + E2.entr_appellido, 'No posee entrenador')

Me acuerdo haberla probado la Query en SQL Server creando las tablas del enunciado y completándola con datos random y para esos datos me funciono. Lo que decis sobre GROUP BY es correcto y por ahi con X datos en las tablas, la consulta corrompa

(21-12-2020 12:41)gonzalo.l escribió: [ -> ]
(21-12-2020 12:39)loqmolesta2 escribió: [ -> ]
(21-12-2020 12:12)gonzalo.l escribió: [ -> ]Buenas loqmolesta2, hasta donde tenia entendido, en los parciales te dejaban utilizar a lo sumo una subquery. En el ejercicio que mostrar, una de las respuestas tiene 4. Te lo toman como valido igual?

Hola,
Si, como el enunciado no decía nada, podías hacerlo como querías, me lo tomaron como 100% valido sin aclaración

Saludos

Otra cosa, la respuesta mas optima es erronea. La clausula group by tiene mal las columnas sobre las que tiene que agrupar. En este enlace esta la explicación: https://www.campusmvp.es/recursos/post/F...acion.aspx
Mas concretamente :
"Es muy importante tener en cuenta que cuando utilizamos la cláusula GROUP BY, los únicos campos que podemos incluir en el SELECT sin que estén dentro de una función de agregación, son los que vayan especificados en el GROUP BY."
En la query, eso no se cumple. La query que seria la "optima" (que hasta donde entendia yo era la unica respuesta que tomaba como valida a la catedra ya que las subquerys no son performantes, cosa que perece que cambio) es:

SELECT E1.entr_nombre + ' ' E1.entr_appellido, ISNULL(E2.entr_nombre + ' ' + E2.entr_appellido, 'No posee entrenador'), ISNULL(COUNT(EE1.enes_especialidad_id), 'No posee entrenador'), ISNULL(COUNT(EE2.enes_especialidad_id), 'No posee entrenador'), ISNULL(SUM(EE1.enes_hs_semanales), 'No posee entrenador'), ISNULL(SUM(EE2.enes_hs_semanales), 'No posee entrenador')
FROM
Entrenador E1
LEFT OUTER JOIN Entrador E2 ON E1.entr_id=E1.entr_id
LEFT OUTER JOIN Entrador_Especialidad EE1 on E1.entr_id=EE1.enes_entrenador_id
LEFT OUTER JOIN Entrador_Especialidad EE2 on E2.entr_id=EE2.enes_entrenador_id
GROUP BY E1.entr_nombre + ' ' E1.entr_appellido, ISNULL(E2.entr_nombre + ' ' + E2.entr_appellido, 'No posee entrenador')

Lo estuve pensado, y creo que no varia el resultado, ya que el por el orden de ejecución de los elementos de las query esta primero el GROUP BY, el cual en mi solución te agrupa (y null es un valor) entonces agrupa por null, y luego cuando pasa a ejecutarse la parte del SELECT se le da un nombre a ese null, en este caso "No posee entrenador".

El SQL Server estos errores deberia alertarlos en pantalla, y no sucedió eso. Asi que intuyo que son equivalentes
Ambas soluciones son válidas.
La resolución de manual es aquella en donde en el group by pones los campos necesarios para dar solución, dado que todo lo demas son funciones que transforman dichos campos, como puede ser el isnull, el operador de concatenación (+), etc.
No obstante por lo general uno copia lo mismo que pone en el select, para ganar tiempo, en el group by dado que los resultados son lo mismo.

En resumen se puede hacer de las dos maneras y ambas están correctas.
URLs de referencia