此代码的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;
答案 0 :(得分:2)
您不能在同一子句中引用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
)
表别名使查询的读写更短
答案 1 :(得分:0)
要按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