2010-04-04 83 views
0

我正在使用Oracle。我試圖編寫這樣的事情:內部查詢中的外部查詢的組函數

SELECT trans_type, 
(SELECT parameter_value FROM transaction_details WHERE id = MAX(t.trans_id)) 
FROM 
(SELECT trans_id, trans_type FROM transactions) t 
GROUP BY trans_type 

所以,我試圖在內部查詢中使用分組結果。但我得到的是我不能使用內部查詢內部一組函數的錯誤:

ORA-00934: group function is not allowed here 

你能比訴諸另一個外部查詢提供了一個替代其他?

UPDATE

按照要求,我張貼的實際查詢的一個較短的版本:

SELECT service_code, 
     currency, 
     (SELECT value FROM exchange_rate WHERE date_added = MIN(t.trans_date)) AS exchange_rate, 
     TRIM(TO_CHAR(SUM(amount), '9999999990.99')) AS amount, 
     TRIM(TO_CHAR(SUM(tax_amount), '9999999990.99')) AS tax_amount, 
     TRIM(TO_CHAR(SUM(total_amount), '9999999990.99')) AS total_amount 
    FROM (SELECT t.amount AS amount, 
       t.trans_date AS trans_date 
       t.tax_amount AS tax_amount, 
       t.total_amount AS total_amount, 
       td1.string_value AS service_code, 
       td2.string_value AS currency 
      FROM transac) t 
GROUP BY service_code, currency 

回答

0

我想什麼你正在尋找是這樣的:

SELECT service_code, 
     currency, 
     er.value as exchange_rate, 
     TRIM(TO_CHAR(SUM(amount), '9999999990.99')) AS amount, 
     TRIM(TO_CHAR(SUM(tax_amount), '9999999990.99')) AS tax_amount, 
     TRIM(TO_CHAR(SUM(total_amount), '9999999990.99')) AS total_amount 
    FROM (SELECT t.amount AS amount, 
       t.tax_amount AS tax_amount, 
       t.total_amount AS total_amount, 
       td1.string_value AS service_code, 
       td2.string_value AS currency, 
       min(t.trans_date) 
        over (partition by td1.string, 
             td2.string) as min_trans_date 
      FROM transac t, table2 td1, table3 td2) t, 
      exchange_rate er 
    WHERE er.date_added = t.min_trans_date 

我不確定這是否是您的解決方案,因爲根據您的查詢,我無法確定您希望最小交易日期基於哪個組。此版本假定您想要給定服務代碼和貨幣組合的最早交易日期。

您正在運行到幾個問題,你的方法:

  1. 需要或者是在GROUP BY子句 或受聚合 功能SELECT子句中的任何列。你有幾個列 不符合這個標準。

  2. 您正嘗試使用 標量子查詢中的外部查詢中的聚合 函數。你不能這樣做 。充其量,您可以在嵌套查詢中獲得 聚合,然後在 之後引用該值。

0

這有什麼錯一個更傳統的查詢:

SELECT t.trans_type, td.parameter_value, MAX(t.trans_id) 
    FROM transactions t 
INNER 
    JOIN transaction_details td ON td.id = t.trans_id 
GROUP BY t.trans_type, td.parameter_value 
+0

實際上,真正的查詢比這更復雜一些,我只是舉了個例子。在真正的查詢中,我使用的是日期字段的最大值 - 按日期加入會有點不方便。 – Dario 2010-04-04 13:40:35

+0

嗯。它可能會幫助您發佈原始查詢的副本(清理完成)。 – 2010-04-04 13:43:49