Ejercicio 602
Consideremos el siguiente documento XML:
<?xml version="1.0" encoding="UTF-8"?>
<bailes>
<baile id="1">
<nombre>Tango</nombre>
<precio cuota="mensual" moneda="euro">27</precio>
<plazas>20</plazas>
<comienzo>1/1/2011</comienzo>
<fin>1/12/2011</fin>
<profesor>Roberto Garcia</profesor>
<sala>1</sala>
</baile>
<baile id="2">
<nombre>Cha-cha-cha</nombre>
<precio cuota="trimestral" moneda="euro">80</precio>
<plazas>18</plazas>
<comienzo>1/2/2011</comienzo>
<fin>31/7/2011</fin>
<profesor>Miriam Gutierrez</profesor>
<sala>1</sala>
</baile>
<baile id="3">
<nombre>Rock</nombre>
<precio cuota="mensual" moneda="euro">30</precio>
<plazas>15</plazas>
<comienzo>1/3/2011</comienzo>
<fin>1/12/2011</fin>
<profesor>Laura Mendiola</profesor>
<sala>1</sala>
</baile>
<baile id="4">
<nombre>Merengue</nombre>
<precio cuota="trimestral" moneda="dolares">75</precio>
<plazas>12</plazas>
<comienzo>1/1/2011</comienzo>
<fin>1/12/2011</fin>
<profesor>Jesus Lozano</profesor>
<sala>2</sala>
</baile>
<baile id="5">
<nombre>Salsa</nombre>
<precio cuota="mensual" moneda="euro">32</precio>
<plazas>10</plazas>
<comienzo>1/5/2011</comienzo>
<fin>1/12/2011</fin>
<profesor>Jesus Lozano</profesor>
<sala>2</sala>
</baile>
<baile id="6">
<nombre>Pasodoble</nombre>
<precio cuota="anual" moneda="euro">320</precio>
<plazas>8</plazas>
<comienzo>1/1/2011</comienzo>
<fin>31/12/2011</fin>
<profesor>Miriam Gutierrez</profesor>
<sala>1</sala>
</baile>
</bailes>
Escribe las consultas XQuery que permitan obtener la siguiente información:
- Cada uno de los nombres de los bailes con la etiqueta
<losbailes>
. - Los nombres de los bailes seguidos con el número de plazas entre paréntesis, ambos dentro de la misma etiqueta
<losbailes>
. - Los nombres de los bailes cuyo precio sea mayor de 30.
- Los nombres de los bailes cuyo precio sea mayor de 30 y la moneda
euro
. - Los nombres y la fecha de comienzo de los bailes que comiencen el mes de enero (utiliza para buscarlo la cadena de texto
/1/
). - Los nombres de los profesores y la sala en la que dan clase, ordenados por sala.
- Los nombres de los profesores, eliminando los repetidos y acompañando cada nombre con todas las salas en la que da clase. Ordenar por nombre.
- La media de los precios de todos los bailes.
- La suma de los precios de los bailes de la sala 1.
- La cantidad de plazas ofertadas por el profesor
Jesus Lozano
. - El dinero que ganaría la profesora
Laura Mendiola
si se completaran todas las plazas de su baile, sabiendo que solo tiene un baile. - El dinero que ganaría el profesor
Jesus Lozano
si se completaran todas las plazas de su baile, pero mostrando el beneficio de cada baile por separado. - Mostrar el dinero que ganaría la profesora
Laura
(no conocemos su apellido) si se completaran todas las plazas de su baile. - El nombre del baile, su precio y el precio con un descuento del 15% para familias numerosas. Ordenar por el nombre del baile.
- Todos los datos de cada baile excepto la fecha de comienzo y de fin.
- En una tabla de HTML, los nombres de los bailes y su profesor, cada uno en una fila.
Solución
- Cada uno de los nombres de los bailes con la etiqueta
<losbailes>
.
for $baile in /bailes/baile
return <losbailes>{$baile/nombre/text()}</losbailes>
for $baile in /bailes/baile/nombre
return <losbailes>{$baile/text()}</losbailes>
- Los nombres de los bailes seguidos con el número de plazas entre paréntesis, ambos dentro de la misma etiqueta
<losbailes>
.
for $baile in /bailes/baile
return <losbailes>{$baile/nombre/text()} ({$baile/plazas/text()})</losbailes>
- Los nombres de los bailes cuyo precio sea mayor de 30.
for $baile in /bailes/baile
where $baile/precio > 30
return $baile/nombre/text()
- Los nombres de los bailes cuyo precio sea mayor de 30 y la moneda
euro
.
for $baile in /bailes/baile
where $baile/precio > 30 and $baile/precio/@moneda = "euro"
return $baile/nombre/text()
- Los nombres y la fecha de comienzo de los bailes que comiencen el mes de enero (utiliza para buscarlo la cadena de texto
/1/
).
for $baile in /bailes/baile
where contains($baile/comienzo, "/1/")
return
<baile>
{$baile/profesor}
{$baile/comienzo}
</baile>
for $baile in /bailes/baile
where contains($baile/comienzo, "/1/")
return concat($baile/profesor/text(), ' ', $baile/comienzo/text())
- Los nombres de los profesores y la sala en la que dan clase, ordenados por sala.
for $baile in /bailes/baile
order by $baile/sala
return
<baile>
{$baile/profesor}
{$baile/sala}
</baile>
- Los nombres de los profesores, eliminando los repetidos y acompañando cada nombre con todas las salas en la que da clase. Ordenar por nombre.
for $profesor in distinct-values(/bailes/baile/profesor)
let $salas := /bailes/baile[profesor=$profesor]/sala
order by $profesor
return
<profesores>
<nombre>{$profesor}</nombre>
{$salas}
</profesores>
- La media de los precios de todos los bailes.
let $baile := /bailes/baile
return <media>{avg($baile/precio)}</media>
let $baile := /bailes/baile
return avg($baile/precio)
let $precios := /bailes/baile/precio
return avg($precios)
avg(
for $precio in /bailes/baile/precio
return $precio
)
- La suma de los precios de los bailes de la sala 1.
sum(
for $baile in /bailes/baile
where $baile/sala="1"
return $baile/precio
)
- La cantidad de plazas ofertadas por el profesor
Jesus Lozano
.
<plazas>
{
sum(
for $baile in /bailes/baile
where $baile/profesor="Jesus Lozano"
return $baile/plazas
)
}
</plazas>
- El dinero que ganaría la profesora
Laura Mendiola
si se completaran todas las plazas de su baile, sabiendo que solo tiene un baile.
for $baile in /bailes/baile
where $baile/profesor="Laura Mendiola"
return $baile/plazas * $baile/precio
- El dinero que ganaría el profesor
Jesus Lozano
si se completaran todas las plazas de su baile, pero mostrando el beneficio de cada baile por separado.
for $baile in /bailes/baile
where $baile/profesor = "Jesus Lozano"
return <beneficio>{$baile/plazas * $baile/precio}</beneficio>
- Mostrar el dinero que ganaría la profesora
Laura
(no conocemos su apellido) si se completaran todas las plazas de su baile.
for $baile in /bailes/baile
where starts-with($baile/profesor, "Laura")
return <beneficio>{$baile/plazas * $baile/precio}</beneficio>
- El nombre del baile, su precio y el precio con un descuento del 15% para familias numerosas. Ordenar por el nombre del baile.
for $baile in /bailes/baile
order by $baile/nombre
return
<baile>
{$baile/nombre}
<precio>{$baile/precio/text()}</precio>
<fam_numerosa>{$baile/precio * 0.85}</fam_numerosa>
</baile>
- Todos los datos de cada baile excepto la fecha de comienzo y de fin.
for $baile in /bailes/baile
return
<baile>
{
$baile/*
except $baile/comienzo
except $baile/fin
}
</baile>
- En una tabla de HTML, los nombres de los bailes y su profesor, cada uno en una fila.
<table>
{
for $baile in /bailes/baile
return
<tr>
<td>{$baile/nombre/text()}</td>
<td>{$baile/profesor/text()}</td>
</tr>
}
</table>