Групповые функции внешнего запроса внутри внутреннего запроса - PullRequest
0 голосов
/ 04 апреля 2010

Я использую 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

Ответы [ 2 ]

0 голосов
/ 05 апреля 2010

Я думаю, что вы ищете что-то вроде этого:

  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. Любой столбец в предложении SELECT должен быть либо в GROUP BY оговорка или предмет совокупности функция. У вас есть несколько столбцов которые не соответствуют этим критериям.

  2. Вы пытаетесь использовать агрегат функция из внешнего запроса в скалярный подзапрос. Вы просто не можете сделать тот. В лучшем случае вы можете получить агрегировать во вложенном запросе, затем укажите это значение позже.

0 голосов
/ 04 апреля 2010

Что не так с более традиционным запросом:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...