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.
| libro | d_factura | c_factura | alumno | curso |
| 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
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
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.
---
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
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
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
Joel,
No funciona.
A parte de errores en la lista de columnas, nunca se dijo que la columna pg estuviese interrelacionada con ninguna tabla.