Помощь Oracle SELECT - PullRequest
       35

Помощь Oracle SELECT

1 голос
/ 29 октября 2009

Вот мой запрос SELECT:

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;

Но я получаю эту ошибку:

ORA-00979: not a GROUP BY expression

Кто-нибудь знает, где может быть проблема? Я немного смущен. У меня есть предложение GROUP BY везде, где я использую агрегатную функцию SUM ().

EDIT:

Еще одна вещь, она перестает работать, когда я добавляю CASE WHEN к запросу:

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;

Ответы [ 4 ]

4 голосов
/ 29 октября 2009

В вашем первом внутреннем SELECT вы должны либо удалить zaloha, GROUP BY, либо применить к нему некоторую статистическую функцию.

0 голосов
/ 29 октября 2009

Попробуйте использовать функцию NVL2 вместо CASE WHEN, по крайней мере, это может привести к более понятному сообщению об ошибке:

    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
0 голосов
/ 29 октября 2009

Ваш второй внутренний выбор:

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

Похоже, что отсутствует группа по предложению, как:

INNER JOIN (SELECT
        id_auto,
        poplatok_denny,
        poplatok_km 
        FROM Auta_zaloha group by id_auto) az
0 голосов
/ 29 октября 2009

Проблема будет в использовании значения

a.poplatok_km

Если вы группируете по a.id_auto, вам нужно дать правило о том, что делать, если в наборе результатов есть несколько строк (даже если есть только одна возможная строка, это то, что SQL не "знать").

Два способа обойти это:

  • добавить все столбцы из таблицы a, которые требуются при расчете, в группу по пункту
  • использовать «псевдо-функцию», такую ​​как min (a.poplatok_km), которая ничего не меняет
...