2

私の問題では、テーブルからデータをクエリし、増加率を計算するための列も含める必要があります。MAXを使用して、増加率が最も高いレコードのみをプルする必要があります。私は正しい方向に進んでいると思いますが、何らかの理由で、最大値だけを要求するhave句にもかかわらず、すべてのレコードが返されます。

Select
  O.Grocery_Item,
  TO_CHAR(sum(g.Price_IN_2000), '$99,990.00') TOTAL_IN_2000,
  TO_CHAR(sum(g.Estimated_Price_In_2025), '$99,990.00') TOTAL_IN_2025,
  TO_CHAR(Round(O.MY_OUTPUT),'9,990') || '%' as My_Output
From
  GROCERY_PRICES g,
  (SELECT
     GROCERY_ITEM,
     (((sum(Estimated_Price_In_2025) -
        sum(Price_IN_2000))/sum(Price_IN_2000))*100) MY_OUTPUT
   FROM
     GROCERY_PRICES
   GROUP BY GROCERY_ITEM) O
Where
  G.GROCERY_ITEM = O.GROCERY_ITEM 
GROUP BY
  O.GROCERY_ITEM, O.MY_OUTPUT
Having
  my_output IN (select Max(O.MY_OUTPUT) from GROCERY_PRICES);

結果:

GROCERY_ITEM                   TOTAL_IN_2000 TOTAL_IN_2025 MY_OUTPUT
------------------------------ ------------- ------------- ---------
M_004                                $2.70         $5.65      109%   
B_001                                $0.80         $2.64      230%   
T_006                                $5.70         $6.65       17%   
B_002                                $2.72         $7.36      171%   
E_001                                $0.62         $1.78      187%   
R_003                                $4.00        $13.20      230%   

 6 rows selected 
4

2 に答える 2

1

クエリを単純化して、Groceries テーブルから 1 回だけ選択することができます。これは、My_Output列が数値の関数にすぎないためです。すでに自己結合を生成している必要はありません。次に、RANK を使用して上位のレコードを取得しました (ただし、同点を気にしない場合は、ROWNUM の方がうまく機能します)。

SELECT  g.Grocery_Item,
        g.TOTAL_IN_2000,
        g.TOTAL_IN_2025,
        g.My_Output
FROM    (   SELECT  Grocery_Item,
                    TO_CHAR(TOTAL_IN_2000, '$99,990.00') TOTAL_IN_2000,
                    TO_CHAR(TOTAL_IN_2025, '$99,990.00') TOTAL_IN_2025,
                    TO_CHAR(ROUND(((TOTAL_IN_2025 / TOTAL_IN_2000) - 1) * 100), '9,990') || '%' as My_Output,
                    RANK() OVER(PARTITION BY Grocery_Item ORDER BY (TOTAL_IN_2025 / TOTAL_IN_2000) - 1 DESC) AS GroceryRank
            FROM    (   SELECT  g.Grocery_Item,
                                SUM(g.Price_IN_2000) TOTAL_IN_2000,
                                SUM(g.Estimated_Price_In_2025) TOTAL_IN_2025
                        FROM    GROCERY_PRICES g
                        GROUP BY g.Grocery_Item
                    ) g
        ) g
WHERE   GroceryRank = 1;

パーセンテージの計算も簡略化しました。

于 2013-01-21T22:16:34.503 に答える
0

代わりにこれを試してください:

select *
from (Select O.Grocery_Item, TO_CHAR(sum(g.Price_IN_2000), '$99,990.00') TOTAL_IN_2000,
             TO_CHAR(sum(g.Estimated_Price_In_2025), '$99,990.00') TOTAL_IN_2025,
             TO_CHAR(Round(O.MY_OUTPUT),'9,990') || '%' as My_Output
      From GROCERY_PRICES g join
           (SELECT GROCERY_ITEM,
                   (((sum(Estimated_Price_In_2025) -
                    sum(Price_IN_2000))/sum(Price_IN_2000))*100
                    ) MY_OUTPUT
            FROM GROCERY_PRICES
            GROUP BY GROCERY_ITEM
           ) O
           on G.GROCERY_ITEM = O.GROCERY_ITEM 
      GROUP BY O.GROCERY_ITEM, O.MY_OUTPUT
      ORDER BY my_output desc
     ) t
where rownum = 1

問題は、サブクエリに外部参照しかないことです。したがって、サブクエリo.my_outputの句ではなく、外部テーブルから取得されます。from値をそれ自体と比較しています。これは、NULL 以外の値の場合は常に true です。

最大値が必要なため、最も簡単な方法は、リストを並べ替えて最初の行を取得することです。これは分析関数でも実行できますが、通常は rownum の方が効率的です。

于 2013-01-21T22:09:36.027 に答える