Lunes, 24 de Octubre de 2005

Reto SQL. ¿Sabrás resolverlo?

Quiero plantear un problema SQL:

Dadas las tablas que se detallan a continuación realizar una consulta (SELECT) que muestre los datos de cada factura (una sóla vez) entre dos fechas determinadas para las facturas que son del tipo pg=1, indicando el nombre del alumno y del curso al que pertenece. En el tipo de facturas pg=1 sólo hay libros pertenecientes al mismo curso. La salida debe presentarse ordenada por curso y numero de factura.



librod_facturac_facturaalumnocurso
id
titulo
id_curso
id_factura
linea
id_libro
cantidad
precio
...
id
fecha
id_alumno
importe
pg
...
id
apellidos
nombre
...
id
nombre
...

¿Se puede hacer? Espero vuestras respuestas en los comentarios y en caso de que no se pueda hacer explicad los motivos.

Actualización:

Por favor, enviad las soluciones con los nombres de tabla y columna en minúsculas para poder probarla.

El viernes pondré la solución a la que he llegado yo.

Actualización (30.10.2005):

Esta es la solución a la que llegué yo:


SELECT DISTINCT c_factura.id, c_factura.numero, c_factura.fecha, c_factura.id_alumno, c_factura.importe, c_factura.pg, concat( alumno.nombre, ' ', alumno.apellidos ), libro.id_curso, curso.nombre FROM libro
INNER JOIN d_factura ON d_factura.id_libro = libro.id
INNER JOIN c_factura ON d_factura.id_factura = c_factura.id
INNER JOIN alumno ON c_factura.id_alumno = alumno.id
INNER JOIN curso ON libro.id_curso = curso.id
WHERE ( c_factura.fecha >= 20050906 AND c_factura.fecha <= 20050906 ) AND c_factura.pg = 1
ORDER BY libro.id_curso, c_factura.id

Jose A. Suárez   |  Comentarios [7]

Comentarios

No estoy seguro si esto es lo que andás buscando, ya que los datos de la cabecera se van a repetir por cada fila del detalle de la factura, así que aca va lo que yo usaría:

SELECT FC.id
,FC.fecha
,(A.Apellidos + A.Nombre) as Alumno
,FC.Importe
,FD.linea
,FD.cantidad
,L.titulo as TituloLibro
,C.Nombre as NombreCurso
,FD.precio
FROM c_factura as FC
LEFT JOIN alumno as A ON A.id = FC.id_Alumno
INNER JOIN d_factura as FD ON FD.id_Factura = FC.id
LEFT JOIN Libro as L ON FD.id_libro = L.id
LEFT JOIN curso as C ON C.id = L.id_curso
WHERE (C.pg = 1)
and (FC.fecha >= @FechaInicio)
and (FC.fecha

Comentado por Carlos E. Rodriguez (Magoo) a Lunes, 24 de Octubre de 2005

Carlos,

Muchas gracias por participar.
Lamento mucho decirlo, pero tu solución no funciona. Tiene, entre otros, errores de sintaxis.

Saludos,

Jose A. Suarez

Comentado por Jose A. Suárez a Martes, 25 de Octubre de 2005

---
No se que pasa pero al hacer una vista previa del comentario me lo corta :(
---

SELECT DISTINCT c.id, c.fecha, c.importe,
a.apellidos, a.nombre, cr.nombre AS curso
FROM c_factura AS c
JOIN d_factura AS d ON d.id_factura=c.id
JOIN alumno AS a ON a.id=c.id_alumno
JOIN libro AS l ON l.id=d.id_libro
JOIN curso AS cr ON cr.id=l.id_curso
WHERE c.pg=1 AND c.fecha>=:fecha_desde AND
c.fecha ORDER BY cr.nombre, c.id

---
Disclaimer: Escrito "al vuelo", sin verificar.
---

Comentado por Jose Alberto a Martes, 25 de Octubre de 2005

Verifica el tema de comentarios, porque corta la sentencia SQL...

despues del "AND c.fecha" lleva un "<=:fecha_hasta" y creo que lo intenta interpretar como código HTML

Comentado por Jose Alberto a Martes, 25 de Octubre de 2005

Por favor, ahora quiero saber.
Cuáles fueron los errores? (sacando de lado que veo que se cortó el final del WHERE y por ende falta el order). Es más, lo comparo con la solución de Jose Alberto y sacando de lado los parámetros (aca admito que los mandé para MS-SQL) las soluciones van parejas.

Nos vemos
Carlos

Comentado por Carlos E. Rodriguez (Magoo) a Martes, 25 de Octubre de 2005

A ver si este funciona José A.

select c.id, c.fecha, c.id_alumno,a.Apellido,a.nombre, c.importe, s.nombre
from c_facturas as c, alumno as a, curso as s
where c.pg=s.id and c.id_alumno=a.id and
c.pg=1 and c.fecha between '01-01-2005' and '31-01-2005'
order by c.pg,c.id

Saludos
Joel Andujo

Comentado por Joel Armando Andujo Medina a Viernes, 28 de Octubre de 2005

Joel,

No funciona.
A parte de errores en la lista de columnas, nunca se dijo que la columna pg estuviese interrelacionada con ninguna tabla.

Comentado por Jose A. Suárez a Viernes, 28 de Octubre de 2005