2009-10-29 7 views
1

Voici ma requête SELECT:Oracle SELECT aide

SELECT 
    a.id_auto, 
    SUM(pozicane_dni * a.poplatok_denny + najazdene_km * a.poplatok_km) celkova_trzba 
FROM Auta a 
INNER JOIN (SELECT 
      id_auto, 
      (SUM(koniec_pozicania - zaciatok_pozicania)) pozicane_dni, 
      (SUM(najazdene_km)) najazdene_km, 
      zaloha 
      FROM Zakaznik GROUP BY id_auto) z 
ON z.id_auto = a.id_auto 
INNER JOIN (SELECT 
      id_auto, 
      poplatok_denny, 
      poplatok_km 
      FROM Auta_zaloha) az 
ON az.id_auto = a.id_auto 
GROUP BY a.id_auto; 

Mais je reçois cette erreur:

ORA-00979: not a GROUP BY expression 

Tout le monde sait où pourrait être le problème? Je suis un peu confuse. J'ai la clause GROUP BY partout où j'utilise la fonction d'agrégat SUM().

EDIT:

une chose, il cesse de fonctionner quand j'ajouter un cas où la requête:

SELECT 
    a.id_auto, a.poplatok_denny, a.poplatok_km, 
    CASE WHEN z.zaloha IS NULL THEN 
     (pozicane_dni * a.poplatok_denny + najazdene_km * a.poplatok_km) 
    ELSE 
     (pozicane_dni * az.poplatok_denny + najazdene_km * az.poplatok_km) 
    END 
     celkova_trzba 
FROM Auta a 
INNER JOIN (SELECT 
      id_auto, 
      (SUM(koniec_pozicania - zaciatok_pozicania)) pozicane_dni, 
      (SUM(najazdene_km)) najazdene_km, 
      zaloha 
      FROM Zakaznik GROUP BY id_auto, zaloha) z 
ON z.id_auto = a.id_auto 
INNER JOIN (SELECT 
      id_auto, 
      poplatok_denny, 
      poplatok_km 
      FROM Auta_zaloha) az 
ON az.id_auto = a.id_auto 
GROUP BY a.id_auto; 

Répondre

4

Dans votre premier SELECT interne, vous devez soit supprimer "zaloha", GROUP BY ou lui appliquer une fonction agrégée.

+0

+1. N'était-ce pas simple? :) – Guru

+0

Encore une chose, il a cessé de fonctionner quand j'ai ajouté un CAS QUAND à la requête :( –

+0

Même problème: Vous devez agréger sur l'expression, par exemple quelque chose comme "SUM (CASE WHEN ... END) celkova_trzba", si Oracle permet une telle syntaxe – Heinzi

0

Le problème sera en utilisant la valeur de

a.poplatok_km 

Si vous groupant par a.id_auto, vous devez donner une règle sur ce qu'il faut faire s'il y a plusieurs lignes dans le jeu de résultats (même s'il n'y a qu'une seule ligne possible, c'est quelque chose que le SQL ne "connaît" pas.

Deux façons de contourner cela:

  • Ajouter toutes les colonnes de la table un qui sont nécessaires dans le calcul dans le groupe par la clause
  • utiliser un « pseudo-fonction » comme min (a.poplatok_km) qui ne change rien
0

Votre deuxième sélection intérieure:

INNER JOIN (SELECT 
     id_auto, 
     poplatok_denny, 
     poplatok_km 
     FROM Auta_zaloha) az 

A ppears à manquer un groupe par article comme:

INNER JOIN (SELECT 
     id_auto, 
     poplatok_denny, 
     poplatok_km 
     FROM Auta_zaloha group by id_auto) az 
+0

Je n'utilise aucune fonction d'agrégat, donc ce n'était pas un problème.Le problème était le premier choix interne –

+0

Et vous n'avez pas besoin de grouper poplatok_denny, poplatok_km? – Guru

0

Essayez d'utiliser la fonction NVL2 à la place de CAS QUAND, au moins, il pourrait donner un message d'erreur plus compréhensible:

NVL2(z.zaloha, 
(pozicane_dni * az.poplatok_denny + najazdene_km * az.poplatok_km), 
(pozicane_dni * a.poplatok_denny + najazdene_km * a.poplatok_km) 
) celkova_trzba