1

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

有谁知道问题出在哪里?我有点困惑。我在使用聚合函数 SUM() 的任何地方都有 GROUP BY 子句。

编辑:

还有一件事,当我在查询中添加 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 回答 4

4

在您的第一个内部 SELECT 中,您应该删除“zaloha”、GROUP BY 或对其应用一些聚合函数。

于 2009-10-29T11:37:47.600 回答
0

问题将在于使用

a.poplatok_km

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

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

  • 在 group by 子句中添加计算所需的表 a 中的所有列
  • 使用像 min (a.poplatok_km) 这样的“伪函数”,它不会改变任何东西
于 2009-10-29T11:39:30.717 回答
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
于 2009-10-29T11:42:42.147 回答
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
于 2009-10-29T12:25:14.143 回答