【问题标题】:SQL-Server An aggregate (Count) may not appear in WHERESQL-Server 聚合(计数)可能不会出现在 WHERE
【发布时间】:2018-05-14 19:05:30
【问题描述】:

在我的查询中,我收到以下错误消息:

聚合可能不会出现在 WHERE 子句中,除非它出现在 HAVING 子句或选择列表中包含的子查询中,并且被聚合的列是外部引用。

我的查询如下:

SELECT f.ID as IdFlight
From Flights as f 
inner join BookingsFlightsPassenger as b on f.ID = b.ID_flight
WHERE count(b.ID_Flight)<100

我该如何解决这个问题?我不确定错误消息是什么意思

【问题讨论】:

  • WHERE更改为HAVING并添加GROUP BY f.ID

标签: sql sql-server tsql


【解决方案1】:

将“where”替换为“have”并添加 group by

SELECT f.ID as IdFlight
From Flights as f inner join BookingsFlightsPassenger as b on f.ID = b.ID_flight
group by f.id
having count(b.ID_Flight)<100

【讨论】:

  • 这可行,但是我的查询是真实查询的简化示例,我还需要插入其他 where 条件。我在哪里添加它们?
  • @user1238784 - 在 where 子句中。 where 用于聚合之前应用的谓词 - 一个有子句用于聚合之后应用的谓词
  • 我原来的查询是:SELECT f.ID as IdFlight, Tarif * 2 as Tarif, f.Time, sl.Name as FromLoc, sl.Country as FromCountry, sl.Airport as FromAirport,dl。 Name as ToLoc, dl.Country as ToCountry, dl.Airport as ToAirport FROM Flights as f INNER JOIN Locations as sl ON sl.ID = f.ID_Source INNER JOIN Locations as dl ON dl.ID = f.ID_Destination INNER JOIN FlightsTarifs as ftf ON f.Id = ftf.IDFlight 内部加入 BookingsFlightsPassenger 作为 b on f.ID = b.ID_flight WHERE count(b.ID_Flight)= '2018/05/16 00: 00' 我如何改变它?
  • 尽量避免回答已在评论部分回答的问题... 这个人没有通过发布答案来回答问题是有原因的,因为它根本不值得回答。这是纯粹的你要代表
  • 您需要添加每个结果列按 (Id, tarif...) 分组
【解决方案2】:

编写此查询的最有效方法不使用join

SELECT bfp.ID_flight as as IdFlight
FROM BookingsFlightsPassenger bfp
GROUP BY bfp.ID_flight
WHERE count(*) < 100;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多