Столбец не распознается в операторе выбора - PullRequest
0 голосов
/ 18 апреля 2020

Я получаю ошибку в операторе Select этого кода.

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;

Возвращаемая ошибка:

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;

Ответы [ 2 ]

2 голосов
/ 18 апреля 2020

Нельзя ссылаться на псевдоним, определенный в предложении SELECT в том же предложении (например, ни в предложении WHERE). Вам нужно либо повторить исходное выражение, либо использовать производную таблицу (подзапрос или cte).

Здесь выражение достаточно простое, поэтому повторение кажется более актуальным:

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;

Примечания:

  • Я добавил TrackId и UnitPrice к пункту GROUP BY; TrackId есть, чтобы избежать неправильной группировки двух дорожек, которые имели бы одинаковые Name; UnitPrice появляется в предложении SELECT и не является частью агрегатной функции, поэтому рекомендуется использовать его и в предложении GROUP BY (хотя, похоже, она функционально зависит от TrackId)

  • псевдонимы таблиц делают запрос короче для чтения и записи

0 голосов
/ 18 апреля 2020

Для заказа по Total_per_track необходимо использовать табличное выражение .

Например:

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
...