Je reçois une erreur dans l'instruction Select de ce code.

SELECT Track.Name, Track.UnitPrice, 
    Count(*) AS Purchase_count, 
    Purchase_count * Track.UnitPrice AS Total_per_track
FROM Track
JOIN InvoiceLine ON Track.TrackId = InvoiceLine.TrackId
GROUP BY Track.Name
ORDER BY  Total_per_track desc
LIMIT 10;

L'erreur renvoyée est

Result: no such column: Purchase_count
At line 1:
SELECT Track.Name, Track.UnitPrice, 
    Count(*) AS Purchase_count, 
    Purchase_count * Track.UnitPrice AS Total_per_track
    FROM Track
    JOIN InvoiceLine
    ON Track.TrackId = InvoiceLine.TrackId
    GROUP BY Track.Name
    ORDER BY  Total_per_track desc
LIMIT 10;
0
ThatDickmanGuy 18 avril 2020 à 17:54

2 réponses

Meilleure réponse

Vous ne pouvez pas faire référence à un alias défini dans la clause SELECT de la même clause (ni dans la clause WHERE par exemple). Vous devez soit répéter l'expression d'origine, soit utiliser une table dérivée (sous-requête ou cte).

Ici, l'expression est assez simple pour que la répétition semble plus pertinente:

SELECT 
    t.Name, 
    t.UnitPrice, 
    COUNT(*) AS Purchase_count, 
    COUNT(*) * t.UnitPrice AS Total_per_track
FROM Track t
INNER JOIN InvoiceLine il ON t.TrackId = il.TrackId
GROUP BY t.TrackId, t.Name, t.UnitPrice
ORDER BY Total_per_track desc
LIMIT 10;

Remarques:

  • J'ai ajouté TrackId et UnitPrice à la clause GROUP BY; TrackId est là pour éviter de grouper à tort deux pistes qui auraient le même Name; UnitPrice apparaît dans la clause SELECT et ne fait pas partie d'une fonction d'agrégation, c'est donc une bonne pratique de l'avoir également dans la clause GROUP BY (bien que cela semble être fonctionnellement dépend de TrackId)

  • les alias de table rendent la requête plus courte en lecture et en écriture

2
GMB 18 avril 2020 à 14:58

Pour trier par Total_per_track, vous devez utiliser une expression de table .

Par exemple:

select *
from (
  SELECT
    Track.Name, Track.UnitPrice, 
    Count(*) AS Purchase_count, 
    Count(*) * Track.UnitPrice AS Total_per_track
  FROM Track
  JOIN InvoiceLine
  ON Track.TrackId = InvoiceLine.TrackId
  GROUP BY Track.Name
) x
ORDER BY Total_per_track desc
LIMIT 10
0
The Impaler 18 avril 2020 à 15:03