2012-09-16 20 views
6

Tengo una tiene un pequeño problema con la consulta de varias tablas. (RDBMS: Acceso)SELECT de varias tablas con GROUP BY

Aquí está el esquema de la base de datos: (solo tablas S_Cards, Libros, Autores, Estudiantes se usan en esta consulta) S_Cards es la orden de libros del Estudiante (en la biblioteca).

DB Scheme

Consulta: Seleccione el autor más popular (s) entre los estudiantes y el número de libros de este autor, que fueron ordenados en la biblioteca.

pesar de que puede obtener la lista de pedidos + autores de este tipo en una consulta:

SELECT 
    Students.FirstName & " " & Students.LastName AS [Student], 
    Books.Name AS [Book], Authors.FirstName & " " & Authors.LastName AS [Author] 
FROM 
    Students, 
    Books, 
    S_Cards, 
    Authors 
WHERE 
    S_Cards.ID_Student = Students.ID 
AND S_Cards.ID_Book = Books.ID 
AND Books.ID_Author = Authors.ID 
ORDER BY Authors.LastName 

Resultado (lo siento, es en ruso):

Query result

no puedo averiguar , ¿por qué no puedo contar y GROUP BY como esto:

SELECT 
    Students.FirstName & " " & Students.LastName AS [Student], 
    Books.Name AS [Book], 
    COUNT(Authors.FirstName & " " & Authors.LastName) AS [Number of books] 
FROM Students, Books, S_Cards, Authors 
WHERE 
    S_Cards.ID_Student = Students.ID 
AND S_Cards.ID_Book = Books.ID 
AND Books.ID_Author = Authors.ID 
GROUP BY 3 

consigo un error que 'Authors.FirstName & '' & Authors.LastName' no es una parte de la función estática o grupo.

Preguntas:

  1. ¿Hay una manera de hacer esta consulta sin JOIN, solamente por GROUP BY, SELECT, UNION y cómo?
  2. Cuál es el problema en mi segunda consulta?

Respuesta

0

La cadena concatenation operator en SQL Server es + no &. Además, debe agrupar por cosas que son no una función de agregado.

SELECT Students.FirstName + ' ' + Students.LastName AS [Student] 
    , Books.Name AS [Book] 
    , COUNT(Authors.FirstName + ' ' + Authors.LastName) AS [Number of books] 
    FROM Students 
    JOIN S_Cards 
    ON S_Cards.ID_Student = Students.ID 
    JOIN BOOKS 
    ON S_Cards.ID_Book = Books.ID 
    JOIN Authors 
    ON Books.ID_Author = Authors.ID 
GROUP BY Students.FirstName + ' ' + Students.LastName 
     , Books.Name 

Tenga en cuenta que he cambiado la consulta con la norma ANSI sintaxis de combinación, lo que hace que los errores mucho más difícil de hacer y es mucho más fácil de leer.

Pensando en ello, el recuento parece un poco extraño. No es el número de libros COUNT(Books.ID)?

+0

Este _assumes_ que está utilizando SQL Server (parece que). Por favor siempre marque las preguntas con el RDBMS apropiado en el futuro. – Ben

+0

Gracias por responder. Creo que COUNT (Books.ID) contaría la cantidad de veces que se ordenó algún libro. Necesito contar cuántas veces se ordenó algún libro del autor, no un libro en particular. RDBMS es Acceso. – Aremyst

0

debe agrupar por cualquier cosa que no es parte de una función agregada:

SELECT 
    Students.FirstName & " " & Students.LastName AS [Student], 
    Books.Name AS [Book], 
    COUNT(Authors.FirstName & " " & Authors.LastName) AS [Number of books] 
FROM Students, Books, S_Cards, Authors 
WHERE 
    S_Cards.ID_Student = Students.ID 
AND S_Cards.ID_Book = Books.ID 
AND Books.ID_Author = Authors.ID 
GROUP BY Students.FirstName & " " & Students.LastName, 
    Books.Name AS [Book] 

Sugiero empezar a usar explícita en lugar de uniones implícita. Hay una mejor opción para MS Access, en su mayor parte.

<...> 
FROM Students 
INNER JOIN S_Cards 
ON Students.ID = S_Cards.ID_Student 

O

<...> 
FROM Students 
LEFT JOIN S_Cards 
ON Students.ID = S_Cards.ID_Student 

La ventana de diseño de la consulta le permitirá construir su JOIN con la sintaxis correcta. Simplemente arrastre y suelte los campos de unión de una tabla a la siguiente y elija el tipo de combinación que necesita.

1

Solución (extraído de older revision in question):

SELECT TOP 1 Author, COUNT(Book) AS [Number of books] FROM 
(
    SELECT 
     Students.FirstName & " " & Students.LastName AS [Student], 
     Books.Name AS [Book], 
     Authors.FirstName & " " & Authors.LastName AS [Author] 
    FROM 
     Students, 
     Books, 
     S_Cards, 
     Authors 
    WHERE 
     S_Cards.ID_Student = Students.ID AND 
     S_Cards.ID_Book = Books.ID AND 
     Books.ID_Author = Authors.ID 
    ORDER BY Authors.LastName 
) 
GROUP BY Author 
ORDER BY 2 DESC