2

bbc(name、region、area、population、gdp)という名前の国のテーブルがあります

最大の(最も人口の多い)国の地域、名前、人口を地域別に示した表が必要です。これまで私はこれを試しました:

SELECT region, name, MAX(population)
FROM bbc
GROUP BY region

エラーメッセージが表示されました:ORA-00979:GROUPBY式ではありません

GROUP BYリージョン、名前に変更しようとしましたが、正しいテーブルが表示されません

4

3 に答える 3

7

次のようなクエリに分析を使用できます。

SELECT name, region, population
  FROM (SELECT region, name, population
             , MAX(population) OVER (PARTITION BY region) maxpop
          FROM bbc)
 WHERE population = maxpop;

インライン ビューでは、ベース テーブルのように見えるテーブルに加えて、地域の最大人口を含む追加の列が表示されます。トップレベルの選択により、国、地域、および各地域で最大の国の人口が得られます。

限られた例で説明するには:

SELECT * FROM bbc;

REGION          NAME        POPULATION
--------------- -------     ----------
North America   USA         300000000
North America   Canada      100000000
North America   Mexico       50000000
South America   Brazil       50000000
South America   Argentina    40000000
South America   Venezuela    20000000

分析関数を追加します。

SELECT region, NAME, population
     , MAX(population) OVER (PARTITION BY region) maxpop
  FROM bbc;

REGION          NAME                POPULATION      MAXPOP
--------------- -------             ----------      ----------
North America   USA                 300000000       300000000
North America   Canada              100000000       300000000
North America   Mexico               50000000       300000000
South America   Brazil               50000000        50000000
South America   Argentina            40000000        50000000
South America   Venezuela            20000000        50000000

次に、完成品:

NAME    REGION             POPULATION
------- ---------------    -----------
USA     North America       300000000
Brazil  South America        50000000

もう1つの編集。ネスト選択は回避できますが、サブクエリは回避できません。

SELECT NAME, region, population
  FROM bbc
 WHERE (region, population) IN
       (SELECT region, MAX(population)
          FROM bbc
         group by region);
于 2011-07-09T19:42:36.400 に答える
3

Oracleにはタプルテストがあるため、コードを短くすることができるため、これを行う最も簡単で最短の方法は次のとおりです。

まず、各地域の最大人口を取得します。

SELECT region, MAX(population)
FROM bbc
GROUP BY region

次に、それに対して国をテストします。

select region, name, population 
from bbc 
where (region, population) in
      (SELECT region, MAX(population)
       FROM bbc
       GROUP BY region)
order by region

多くのRDBMSをサポートする場合は、EXISTSを使用します。

select region, name, population 
from bbc o
where exists
      (SELECT null -- neutral. doesn't invoke Cargo Cult Programming ;-)
       FROM bbc
       WHERE region = o.region 
       GROUP BY region
       HAVING o.population = MAX(population) )
order by region

ここでテストされたクエリは、どちらも同様の出力を示します:http ://sqlzoo.net/0.htm

http://www.ienablemuch.com/2010/05/why-is-exists-select-1-cargo-cult.html

于 2011-07-10T02:22:17.583 に答える
0

ほとんどの花瓶では、集計されていない列が GROUP BY 句に含まれていないため、ORA-00979 エラーが発生します。この場合、GROUP BY 句に名前も含める必要があります。また、FROM ステートメントで MAX 関数を呼び出すべきではありません。

SELECT region, name, MAX(population)
FROM bbc
GROUP BY region, name
于 2011-07-09T19:42:21.327 に答える