0
votes

Comment faire cette recherche dans SQL

Ma tâche consiste à créer une déclaration pour répondre à ceci:

lister chaque auteur (par nom Nom et prénom) et le nombre de livres écrits par l'auteur.

La base de données contient trois tables qui seront utilisées

table de livre avec ISBN (primaire), titre, type, pub_id, prix, avance, ytd_sales, pub_date

table de réserve (qui est entre le livre et l'auteur) avec, auteur_id (primaire), ISBN, Author_order, Royaltyshare

Table d'auteur avec, auteure_id (primaire), SSN, Nom, prénom, téléphone, adresse, ville, état, zip < / p> xxx

C'est ce que j'ai eu, mais cela ne fonctionne pas et que, pour une raison quelconque, j'ai du mal à comprendre ce type d'instructions SQL avec jointure et dans les types de déclarations. Si quelqu'un pouvait aider à expliquer plus le processus, cela serait très apprécié.


3 commentaires

MySQL ou SQL Server?


Ce n'est pas parce que deux auteurs ont le même nom, cela ne signifie pas qu'ils sont la même personne. C'est pourquoi vous avez un auteur_id!


@Strawberry Bon point. J'ai mis à jour ma réponse pour le prendre en compte.


5 Réponses :


0
votes

Vous êtes manquant prénom dans groupe par . De plus, la façon dont vous avez utilisé compte n'est pas correcte. Essayez ce qui suit. xxx


0 commentaires

1
votes

Une fois que vous avez une table d'alias, vous devez utiliser l'alias lorsque vous vous référez plus tard à cette table:

select 
    a.lastname, 
    a.firstname, 
    TotalBooksForAuthor = count(a.author_id)
from 
    author a
    join bookauthor ba on ba.author_id = a.author_id
group by
    a.author_id,
    a.lastname,
    a.firstname


0 commentaires

3
votes

Vous avez quelques problèmes. Dès le début de la requête:

  1. Lorsque vous définissez un alias de table ( A code> est l'alias pour auteur code>) Vous devez strong> utiliser cet alias partout où vous vous référez spécifiquement à la Auteur code> Table, donc dans votre Sélectionnez CODE> Vous devez dire Sélectionnez A.LastName, A.FirstName Code>; Li>;
  2. Lorsque vous souhaitez Nombre code> quelque chose, le nom de la table se passe à l'intérieur du nombre code> code>, et encore une fois, vous devez utiliser l'alias de table que vous avez défini: compte (BA. autorien_id) code> li>
  3. Vous pouvez utiliser un alias de colonne pour votre compte pour faciliter la référence à E.G. compte (ba.author_id) comme num_books code> li>
  4. Vous devez utiliser un rejoindre code> de sorte que vous puissiez répertorier les auteurs qui n'ont écrit aucun livre (s'il y en a) li>
  5. Pour être strictement conforme, vous devriez groupe par code> toutes les colonnes non agrégées, de sorte que cela doit être groupe par a.lastname, a.firstname code>. LI >
  6. Comme il a été signalé par @strowberry, vous devriez vraiment grouper par auteure_id code>, car il est possible que deux auteurs ont le même nom. Etant donné que auth -_id code> est une clé principale, dans MySQL, il est ok pour seulement groupe par ce champ, mais SQL Server nécessite que vous regroupez toujours par lastname code> et firstName code> aussi. li> ol>

    Au total, votre requête doit être: p>

    SELECT a.lastname, a.firstname, COUNT(ba.author_id) AS num_books
    FROM author a
    LEFT JOIN bookauthor ba ON ba.author_id = a.author_id
    GROUP BY a.author_id, a.lastname, a.firstname
    


0 commentaires

-1
votes

Essayez cette syntaxe SQL:

SELECT a.lastname + ', '+ a.firstname, COUNT(b.author_id)
FROM author AS a
LEFT JOIN bookauthor AS b ON a.author_id = b.author_id
GROUP BY a.lastname, a.firstname


0 commentaires

0
votes

Vous devez inclure toutes les colonnes de sélection dans votre groupe par code> et d'autre part une fois que vous avez aliasé une table, utilisez ce nom aliasé partout:

select  a.firstname, a.lastname, count(ba.author_id)
from author a
join bookauthor ba on ba.author_id = a.author_id
group by a.firstname, a.lastname


0 commentaires