【问题标题】:Oracle SELECT helpOracle 选择帮助
【发布时间】:2010-12-11 05:07:14
【问题描述】:

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

【问题讨论】:

    标签: sql oracle ora-00979


    【解决方案1】:

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

    【讨论】:

    • 还有一件事,当我在查询中添加 CASE WHEN 时它停止工作:(
    • 同样的问题:您需要对表达式进行聚合,例如如果 Oracle 允许这样的语法,则类似于“SUM(CASE WHEN ... END) celkova_trzba”。
    【解决方案2】:

    问题在于使用的值

    a.poplatok_km
    

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

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

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

    【讨论】:

      【解决方案3】:

      你的第二个内在选择:

      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
      

      【讨论】:

      • 我没有在那里使用任何聚合函数,所以这不是问题。问题是第一个内部选择。
      • 而且你不需要对 poplatok_denny, poplatok_km 进行分组?
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2021-04-02
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 1970-01-01
        • 2011-09-17
        • 2011-04-03
        相关资源
        最近更新 更多