2011-06-19 75 views
1

我的问题是编写一个SQL查询,它将确定哪个是最便宜的场所,可容纳120人。SQL - 最小功能

代码中,我写了

select v.venuename, min(v.costperday) 
from venues v 
where v.venuecapacity = 120 
Group By v.venuename; 

我仍然得到两个答案,而不是至少一个。

但是,如果我从选择功能删除V.venueName .....我得到正确的答案!

这是为什么?

您的帮助将不胜感激。 感谢

+1

这是不可能的一个选择更多的字段更改结果集。 – zerkms

回答

1

您在选择列表中的同一领域,因此分将被计算为他们每个人的不是整体项目

+0

我没有。不知道为什么。你的回答是有道理的。 – GolezTrol

+0

我做了:)因为'select'列表中的值与返回的行数无关。一切都取决于“分组”的价值。 – Karolis

+1

'您在选择列表中包含相同的字段',并且由相同的字段表示字段在group by子句中。我想回答问题的真正需要,(为什么他会得到这个结果),但解决方案是别的,他应该从组中删除该字段以获得结果 –

2
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人,但仍然比其他人只能容纳120人更便宜

0
select v.venuename, min(v.costperday) 
from 
(
    select venuename, costperday 
    from venues 
    where v.venuecapacity = 120) v 
0

那是因为如果您包含名称,您选择每个场所每天的最低成本。事实上,只要venuename是独一无二的,整个分组在整个表中都是无用的。

要获得最低的价格使用像这样的场地:

select venuename, costperday 
from 
    venues v 
where 
    v.venuecapacity = 120 and 
    v.costperday = (select min(costperday) from venue vs where va.venuecapacity = 120) 
0

我认为这可能是你想要什么:

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人。

0

使用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; 
0

我的问题是写一个SQL查询 将决定哪些是最昂贵 场地,可容纳 120人。

在SQL Server中,我会用select top 1... order by

select top 1 v.venuename, v.costperday 
from venues v 
where v.venuecapacity = 120 
order by v.costperday 

Goggling了一下,我发现这个语法MySQL和Oracle看起来像他们将工作,但由我未经测试。

MySQL的

select v.venuename, v.costperday 
from venues v 
where v.venuecapacity = 120 
order by v.costperday 
limit 1 

甲骨文

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 
0

@Rahul巴蒂亚

还有一个解决方案,我们可以使用..

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);