2010-04-04 8 views
0

J'utilise Oracle. J'essaye de composer quelque chose comme ceci:Fonctions de groupe de requête externe dans la requête interne

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 

Ainsi, j'essaye d'employer un résultat de grouper à l'intérieur d'une question intérieure. Mais je reçois l'erreur que je ne peux pas utiliser une fonction de groupe à l'intérieur de la requête interne:

ORA-00934: group function is not allowed here 

Pouvez-vous proposer une autre alternative que de recourir à une autre requête externe?

MISE À JOUR

Comme demandé, je posterai une version plus courte de la requête réelle:

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 

Répondre

0

Je pense que vous cherchez est quelque chose comme ceci:

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 

Je ne suis pas sûr que ce soit vraiment votre solution, parce que, selon votre requête, je ne peux pas dire à quel groupe vous voulez que la date de transaction minimale soit basée. Cette version suppose que vous souhaitez la date de transaction la plus proche pour une combinaison donnée de code de service et de devise.

Vous êtes en cours d'exécution dans un problème de couple avec votre approche:

  1. Toute colonne dans la clause SELECT doit être soit dans le GROUP BY clause ou sous réserve d'une fonction globale. Vous avez plusieurs colonnes qui échouent à ce critère.

  2. Vous essayez d'utiliser une fonction agrégée à partir de la requête externe dans la sous-requête scalaire . Vous ne pouvez pas faire cela. Au mieux, vous pouvez obtenir l'agrégat dans une requête imbriquée, puis référencer cette valeur ultérieurement.

0

Quel est le problème avec une requête plus traditionnelle:

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

En fait, la vraie requête est un peu plus compliquée que cela, je donnais juste un exemple. Dans la requête réelle, j'utilise le maximum d'un champ de date - il est un peu incommode de se joindre par dates. – Dario

+0

Hmmm. Cela peut vous aider à publier une copie (désinfectée pour SO) de votre requête d'origine. –

Questions connexes