2009-10-29 74 views
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子句。

編輯:

一兩件事,它停止工作,當我添加病例時,查詢:

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

在你的第一個內部SELECT,您應該刪除「zaloha」,GROUP BY它或者將一些聚合函數應用於它。

+0

+1。不是那麼簡單嗎? :) – Guru 2009-10-29 11:50:14

+0

還有一件事,它停止工作,當我添加CASE時,以查詢:( – 2009-10-29 11:59:28

+0

同樣的問題:你需要聚合的表達式,例如像「SUM(CASE當......結束)celkova_trzba」,如果Oracle允許使用這樣的語法 – Heinzi 2009-10-29 13:25:46

0

問題會在使用

a.poplatok_km 

如果你被a.id_auto分組的價值,你需要給上是否有結果集的多個行(做什麼的規則即使只有一個可能的行,這是SQL不知道的東西)。

兩種解決此方法:

  • 從所需的組中的計算由子句
  • 使用「僞功能」等分鐘(a.poplatok_km)表中添加的所有列,其不會改變任何東西
0

你的第二個內部的選擇:

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

一ppears由子句缺少一個團,如:

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

我沒有使用任何聚合函數,所以這不是問題,問題是第一個內部選擇 – 2009-10-29 11:47:14

+0

而且你不需要將poplatok_denny,poplatok_km分組? – Guru 2009-10-29 11:49:13

0

嘗試在地方CASE的使用NVL2功能時,至少它可以產生更多的理解錯誤信息:

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