2011-06-19 73 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);