2

私の作業テーブル、テーブル名: sales

これがMY TABLEです。[sl_noは主キーです]テーブル構造:

CREATE TABLE  SALES 
  ( SL_NO NUMBER PRIMARY KEY, REGION VARCHAR2(10) NOT NULL, 
    MONTH VARCHAR2(20) NOT NULL, YEAR NUMBER NOT NULL, 
    SALES_AMOUNT NUMBER NOT NULL )

ここにテーブルデータがあります:

SQL> select * from sales;

     SL_NO REGION     MONTH                      YEAR SALES_AMOUNT
---------- ---------- -------------------- ---------- ------------
         1 east       december                   2011       750000
         2 east       august                     2011       800000
         3 west       january                    2012       640000
         5 east       march                      2012      1200000
         6 west       february                   2011       580000
         4 west       april                      2011       555000

6 rows selected.

このクエリを試して、[2011,2012] 年の総売上高を表示しました。

 SELECT year, SUM(sales_amount) FROM sales GROUP BY year;

      YEAR SUM(SALES_AMOUNT)
---------- -----------------
      2011           2685000
      2012           1840000

MY GOAL:> 売上高が最大となった年を知りたいです。 私はこれを試してみましたが、完全に機能します...しかし、その年も表示したい場合、エラーが発生します。

SQL> select  max(sum(sales_amount)) from sales group by year;

MAX(SUM(SALES_AMOUNT))
----------------------
               2685000

SQL> select year, max(sum(sales_amount)) from sales group by year;
select year, max(sum(sales_amount)) from sales group by year
       *
ERROR at line 1:
ORA-00937: not a single-group group function

おまけ: 複数の行が同じ値の場合....両方の年 [2011,2012] の売上額が同じ場合、 すると....

この問題を解決するのを手伝ってください。

4

4 に答える 4

0

これはうまくいくはずです。

with yr_agg as (
  select year, sum(sales_amount) as total
  from sales
  group by year
)
select year, total as max_total
from yr_agg
where total = (select max(total)
               from yr_agg);
于 2013-07-28T08:28:57.720 に答える
0

最も簡単な方法は、結果を並べ替えて最初の行を取ることだと思います。

select year, sales_amount
from (SELECT year, SUM(sales_amount) as sales_amount
      FROM sales
      GROUP BY year
      order by sum(sales_amount) desc
     ) t
where rownum = 1;

編集:

一致するすべての行を表示する必要がある場合 (質問には記載されていません)、dense_rank()分析関数を使用することをお勧めします。

select year, sales_amount
from (SELECT year, SUM(sales_amount) as sales_amount,
             dense_rank(over order by SUM(sales_amount) desc) as seqnum
      FROM sales
      GROUP BY year
      order by sum(sales_amount) desc
     ) t
where seqnum = 1;

max()または、代わりにバージョンが好きかもしれません:

select year, sales_amount
from (SELECT year, SUM(sales_amount) as sales_amount,
             max(sum(sales_amount)) over () as maxsa
      FROM sales
      GROUP BY year
      order by sum(sales_amount) desc
     ) t
where sales_amount = maxsa;
于 2013-07-28T13:06:53.493 に答える