Oracle SELECT帮助

时间:2009-10-29 11:27:10

标签: sql oracle ora-00979

这是我的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()。

编辑:

还有一件事,当我向查询添加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 个答案:

答案 0 :(得分:4)

在你的第一个内部SELECT中,你应该删除“zaloha”,GROUP BY它或者应用一些聚合函数。

答案 1 :(得分:0)

问题在于使用

的值
a.poplatok_km

如果您按a.id_auto进行分组,则需要给出一个规则,说明如果结果集中有多行,该怎么办(即使只有一个可能的行,这是SQL不能“知道”)。

解决这个问题的两种方法:

  • 在group by子句
  • 中添加计算中所需的表a中的所有列
  • 使用像min(a.poplatok_km)这样不会改变任何东西的“伪功能”

答案 2 :(得分:0)

你的第二个内在选择:

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

似乎缺少一个group by子句,如:

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

答案 3 :(得分:0)

尝试使用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