代码之家  ›  专栏  ›  技术社区  ›  Richard Knop

Oracle选择帮助

  •  1
  • Richard Knop  · 技术社区  · 15 年前

    这是我的选择查询:

    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子句。

    编辑:

    还有一件事,当我向查询添加案例时,它停止工作:

    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 回复  |  直到 13 年前
        1
  •  4
  •   Heinzi    15 年前

    在第一个内部选择中,您应该删除“zaloha”,按它分组,或者对它应用一些聚合函数。

        2
  •  0
  •   Thorsten    15 年前

    问题在于使用

    a.poplatok_km
    

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

    有两种解决方法:

    • 在group by子句中添加表A中计算所需的所有列
    • 使用“伪函数”,如min(a.poplatok_km),它不会改变任何东西。
        3
  •  0
  •   Tendayi Mawushe    15 年前

    您的第二个内部选择:

    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
    
        4
  •  0
  •   Juraj    15 年前

    尝试使用nvl2函数代替case,至少它可以生成更易于理解的错误消息:

        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