选择语句中无法识别的列

时间:2020-04-18 14:54:21

标签: sql group-by column-alias

此代码的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 个答案:

答案 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子句中添加了UnitPriceGROUP BYTrackId可以避免将具有相同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