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】:

这就是为什么我真的不喜欢人们使用文字字符串作为别名; 唯一这个作品的地方是SELECTGROUP 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 BYSELECT 之前处理了几个步骤(分别是步骤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.FirstNameG.LastName,并将GuestName 的表达式包装在MAX 中:

MAX(G.FirstName + ' ' + G.LastName AS GuestName) AS GuestName

【讨论】:

感谢您花时间解释这个问题。我不知道我不能以我为列创建的别名为中心。感谢您为让我清楚问题所付出的努力。

以上是关于T-SQL GROUP BY 也使用 JOIN、聚合和外部引用错误的主要内容,如果未能解决你的问题,请参考以下文章

join ,group by

SQL (Hive):在使用 GROUP BY 进行聚合时使用窗口函数

T-Sql语法:GROUP BY子句GROUPING SETSCUBEROLLUP

sqllinq和lambda查询语句比较inner join和group by组合使用及匿名类型的处理

带有 GROUP BY id 的 T-SQL SELECT

使用 Join 和 Group By 更新语句