T-SQL GROUP BY 也使用 JOIN、聚合和外部引用错误
Posted
技术标签:
【中文标题】T-SQL GROUP BY 也使用 JOIN、聚合和外部引用错误【英文标题】:T-SQL GROUP BY also using JOIN, Aggregate and Outer Reference errors 【发布时间】:2021-11-19 19:00:03 【问题描述】:我正在学习 SQL 并尝试加入几个模拟酒店表并进行一个简单的查询,以显示客人的串联姓名和他们进行的预订数量。
无论我如何尝试重组查询,我都会遇到两个错误之一。
如果我这样尝试:
SELECT
[Guests].FirstName + ' ' + [Guests].LastName AS 'Guest Name',
[ReservationsRooms].Reservation_ID
FROM
[ReservationsRooms]
JOIN
[Reservations] ON [ReservationsRooms].Reservation_ID = [Reservations].Reservation_ID
JOIN
[Guests] ON [Reservations].Guest_ID = [Guests].Guest_ID
GROUP BY
[Guests].Guest_ID
我收到一个错误:
选择列表中的“Guests.FirstName”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
我认为可能是模棱两可的问题,所以我也尝试了如下:
SELECT
[Guests].FirstName + ' ' + [Guests].LastName AS 'Guest Name',
COUNT([ReservationsRooms].Reservation_ID) AS 'Reservations'
FROM
[ReservationsRooms]
JOIN
[Reservations] ON [ReservationsRooms].Reservation_ID = [Reservations].Reservation_ID
JOIN
[Guests] ON [Reservations].Guest_ID = [Guests].Guest_ID
GROUP BY
[Guests].Guest_ID, 'Guest Name'
但这也导致了错误:
每个 GROUP BY 表达式必须至少包含一个不是外部引用的列。
我正在尝试创建一个返回如下内容的查询结果:
Reservations Guest Name
-------------------------------
4 Mack Simmer
3 Bettyann Seery
2 Duane Cullison
2 Aurore Lipton
2 Maritza Tilton
2 Joleen Tison
具体来说,我只希望查询中的这两列,但似乎找不到方法。
【问题讨论】:
对于如何使用聚合似乎有些误解,您需要根据Minimal, Reproducible Example为您的预期结果包含示例数据 【参考方案1】:这就是为什么我真的不喜欢人们使用文字字符串作为别名; 唯一这个作品的地方是SELECT
。 GROUP BY 'Guest Name'
并不意味着“按别名为 'Guest Name'
的列分组”,它的意思是“按 文字字符串 'Guest Name'
分组”,毫无疑问,这没有任何意义。
即使您为别名使用了更好的定界标识符,无论是 T-SQL 的括号 ([]
) 还是 ANSI-SQL 的双引号 ("
),您仍然无法执行您所做的操作因为您不能通过 GROUP BY
中的别名引用列(例如 GROUP BY [Guest Name]
会产生错误 "Invalid column name 'Guest Name'")。这是因为Logical Processing Order of the SELECT statement 和GROUP BY
在SELECT
之前处理了几个步骤(分别是步骤5 和8),因此别名在GROUP BY
中没有上下文。
相反,您要么需要GROUP BY
表达式本身,要么需要表达式中包含的列。我个人会在这里使用后者。
SELECT G.FirstName + ' ' + G.LastName AS GuestName, --Generally, avoid names that need delimit identification
COUNT(RR.Reservation_ID) AS Reservations
FROM dbo.ReservationsRooms RR --Always schema qualify. Also aliases are good.
JOIN dbo.Reservations ON RR.Reservation_ID = R.Reservation_ID
JOIN dbo.Guests G ON R.Guest_ID = G.Guest_ID
GROUP BY G.FirstName,
G.LastName,
G.Guest_ID;
或者,您可以从GROUP BY
中完全省略G.FirstName
和G.LastName
,并将GuestName
的表达式包装在MAX
中:
MAX(G.FirstName + ' ' + G.LastName AS GuestName) AS GuestName
【讨论】:
感谢您花时间解释这个问题。我不知道我不能以我为列创建的别名为中心。感谢您为让我清楚问题所付出的努力。以上是关于T-SQL GROUP BY 也使用 JOIN、聚合和外部引用错误的主要内容,如果未能解决你的问题,请参考以下文章
SQL (Hive):在使用 GROUP BY 进行聚合时使用窗口函数
T-Sql语法:GROUP BY子句GROUPING SETSCUBEROLLUP