2012-09-16 14 views
6

Ho un piccolo problema con query multitable. (RDBMS: Accesso)SELEZIONA da più tabelle con GROUP BY

Ecco lo schema del database: (solo le tabelle S_Cards, Libri, Autori, Studenti vengono utilizzate in questa query) S_Cards è l'ordine del libro degli studenti (in libreria).

DB Scheme

Query: Selezionare l'autore più popolare (s) tra gli studenti e il numero di libri di questo autore, che sono stati ordinati in libreria.

Anche se posso ottenere l'elenco degli ordini + autori come questo in una query:

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 

Risultato (mi dispiace, è in russo):

Query result

non riesco a capire , perché non riesco a COUNT e GROUP BY in questo modo:

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 

Ho un errore che "Authors.FirstName &" "& Authors.LastName" non fa parte della funzione o del gruppo statici.

Domande:

  1. C'è un modo per farlo query senza JOIN, solo da GROUP BY, SELECT, UNION e come?
  2. Qual è il problema nella mia seconda query?

risposta

0

La stringa concatenation operator in SQL Server non è +&. Inoltre, dovresti raggruppare per elementi che sono non una funzione di aggregazione.

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 

Si prega di notare che ho cambiato la query allo standard ANSI join sintassi, il che rende gli errori che molto più difficile da fare ed è molto più facile da leggere.

Pensandoci, il tuo numero sembra un po 'strano. Il numero di libri non è COUNT(Books.ID)?

+0

Questo _assumes_ stai usando SQL Server (lo sembra). In futuro, contrassegnare sempre le domande con l'RDBMS appropriato. – Ben

+0

Grazie per la risposta. Penso che COUNT (Books.ID) conterebbe il numero di volte in cui è stato ordinato un libro. Devo contare quante volte sono stati ordinati tutti i libri dell'autore, non un libro particolare. RDBMS è accesso. – Aremyst

0

È necessario GROUP BY tutto ciò che non fa parte di una funzione di aggregazione:

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] 

ti suggerisco di iniziare a utilizzare esplicito piuttosto che unisce implicito. Ci sono una scelta migliore per MS Access, per la maggior 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 finestra di Progettazione query vi permetterà di costruire la vostra unirsi con la sintassi corretta. Basta trascinare e rilasciare i campi di join da una tabella alla successiva e scegliere il tipo di join necessario.

1

Solution (estratto da 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