2010-04-04 6 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 пункта или субъекта к совокупным функции. У вас есть несколько столбцов , которые не соответствуют этим критериям.

  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

+0

Хммм. Это может помочь вам опубликовать копию вашего исходного запроса (очищенная для SO). –

Смежные вопросы