2013-01-21 51 views
2

我的問題需要我從表中查詢數據,幷包含一列以計算%增加。我只需要使用MAX來提取最高增長百分比的記錄。我認爲我在正確的軌道上,但由於某種原因,儘管有條款要求最大限度地返回所有記錄。最大返回自加入的所有值

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 
+0

由於您的羣組是由項目決定的,因此最大輸出也是按項目。如果你只想要一個最高百分比的項目,你可能需要做一個子選擇OR,通過my_output命令將輸出限制爲1條記錄 – xQbert

+0

我不認爲這條線是合法的:'select Max(O。 MY_OUTPUT)',引用'O.MY_OUTPUT'並從'GROCERY_PRICES'查詢它。 –

+0

謝謝你們,不幸命令它似乎沒有幫助。另外,'選擇MAX(O.MY_output)只是一個錯誤,但它不會影響結果。 – RyanPatrick

回答

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通常更高效。

+0

感謝您的幫助,查詢反彈了17%,這是MIN。我應該改變1來滿足MAX嗎? – RyanPatrick

+0

我編輯查詢以在'order by'中添加'desc'。只需在。 –

+0

再次感謝,您的建議工作時,我調整了,但我需要拉所有記錄在MAX。在這種情況下,還有2.仍然試圖讓我的頭在你的自我引用部分的解釋(我是一個新手) – RyanPatrick

1

您可以簡化您的查詢,因此您只能從Groceries表中選擇一次,因爲您的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; 

我還簡化了您的百分比計算。