Mysql SQL-Min函数
我的问题是编写一个SQL查询,确定哪一个场地最便宜,可以容纳120人 我写的代码Mysql SQL-Min函数,mysql,sql,oracle,Mysql,Sql,Oracle,我的问题是编写一个SQL查询,确定哪一个场地最便宜,可以容纳120人 我写的代码 select v.venuename, min(v.costperday) from venues v where v.venuecapacity = 120 Group By v.venuename; 我仍然得到了两个答案,一个也没有得到 但是如果我从select函数中删除V.venueName…我会得到正确的答案 为什么会这样 非常感谢你的帮助。 感谢您在选择列表中包含相同的字段,因此将为每个字段计算最小
select v.venuename, min(v.costperday)
from venues v
where v.venuecapacity = 120
Group By v.venuename;
我仍然得到了两个答案,一个也没有得到
但是如果我从select函数中删除V.venueName…我会得到正确的答案
为什么会这样
非常感谢你的帮助。
感谢您在选择列表中包含相同的字段,因此将为每个字段计算最小值,而不是为所有项目计算最小值
SELECT *
FROM (
SELECT venuename,
costperday,
min(costperday) over () as min_cost,
FROM venues
WHERE venuecapacity = 120
) v
WHERE v.min_cost = v.costperday
或使用子选择:
SELECT *
FROM venues
WHERE venuecapacity = 120
AND costperday = (SELECT min(v2.costperday)
FROM venues v2
WHERE v2.venuecapacity = 120)
如果有些场馆可容纳120人以上,但仍然比只允许120人的场馆便宜,那么您可能希望使用venuecapacity
=120
,这是因为如果您包括名称,您选择了每个场馆每天的最低成本。事实上,只要VenuName是唯一的,整个分组在这个表中是无用的
select v.venuename, min(v.costperday)
from
(
select venuename, costperday
from venues
where v.venuecapacity = 120) v
要获得价格最低的场地,请使用以下内容:
select venuename, costperday
from
venues v
where
v.venuecapacity = 120 and
v.costperday = (select min(costperday) from venue vs where va.venuecapacity = 120)
我想这可能是你想要的:
SELECT venuename
FROM (SELECT venuename, costperday, MIN(costperday) OVER () mincost
FROM venues
WHERE venuecapacity >= 120) q
WHERE q.costperday = q.mincost;
使用>=120,因为您可能没有任何场馆正好有120个容量,并且您希望所有场馆至少能处理120个容量。您的要求仅说明场馆能容纳120人,而不是说它能容纳120人。使用CTE可以做到这一点
WITH minquery AS
(SELECT min(costperday) AS mincost
FROM venues
WHERE venuecapacity>=120)
SELECT venuename, venuecapacity, costperday
FROM venues
WHERE costperday=minquery.mincost AND venuecapacity>=120;
我的问题是编写一个SQL查询
将确定哪一个最小
昂贵的场地,可容纳
120人
在SQL Server中,我将使用选择Top1。。。订购人
select top 1 v.venuename, v.costperday
from venues v
where v.venuecapacity = 120
order by v.costperday
我有点目不转睛地发现MySQL和Oracle的这种语法似乎可以工作,但我没有测试过
MySQL
神谕
select v.venuename, v.costperday
from (select v.venuename, v.costperday
from venues v
where v.venuecapacity = 120
order by v.costperday
)
where rownum = 1
@拉胡尔·巴蒂亚
我们还可以使用另外一种解决方案
select v.venuename,
min(v.costperday)
from venues v
where v.venuecapacity >= 120
Group By v.venuename
having min(v.costperday) = (
select min(costperday)
from venues
where venuecapacity >= 120 );
选择多个字段不可能更改结果集。我没有。不知道为什么。你的回答有道理。我回答了:)因为
select
列表中的值与返回的行数无关。一切都取决于group by
值。您在选择列表中包括相同的字段
,我指的是group by子句中的字段。我想准确地回答这个问题(为什么他会得到那个结果),但解决办法是别的,他应该从group by中删除该字段以获得结果。如果选择列表中没有包含相同的字段,则仍然会为每个分组的VenuName
计算最小值,如果该值在group by
子句中。
select v.venuename,
min(v.costperday)
from venues v
where v.venuecapacity >= 120
Group By v.venuename
having min(v.costperday) = (
select min(costperday)
from venues
where venuecapacity >= 120 );