2015-11-04 65 views
2
SELECT R.CALL, 
     P.NAME, 
     R.PID, 
     TIMESTAMPDIFF(4, CHAR(TIMESTAMP(M.ENDTIME) - TIMESTAMP(M.START))) AS MINUTES 
FROM ROSTER R, PLAYER_ON P, MATCH M 
WHERE R.CALL = P.CALL 
    AND R.PID = P.PID 
    AND M.START = R.START 
ORDER BY R.CALL ASC, P.NAME ASC 

上面是我的查詢,我成功地從數據庫中獲取了所需的列。SQL查詢如何在表中按名稱分組

但是我還有一步要走。 用於查詢的樣本輸出是這樣的: Output

我的問題是:我怎麼通過名稱總結總分鐘數組,例如,愛德華·埃利斯將與總分鐘出現在輸出中只有一次573 + 4933 。

這裏是我的嘗試:

SELECT CALL, 
     NAME, 
     PID, 
     SUM(MINUTES) 
FROM ( 
     SELECT R.CALL, 
      P.NAME, 
      R.PID, 
      TIMESTAMPDIFF(4, CHAR(TIMESTAMP(M.ENDTIME) - TIMESTAMP(M.START))) AS MINUTES 
     FROM ROSTER R, PLAYER_ON P, MATCH M 
     WHERE R.CALL = P.CALL 
     AND R.PID = P.PID 
     AND M.START = R.START) 
GROUP BY NAME 

但有一個錯誤說:

SQL0119N的表達式開始 「PID」 在SELECT子句, HAVING子句或ORDER BY指定子句未在GROUP BY子句或 中指定,它位於SELECT子句,HAVING子句或ORDER BY子句中,其列 函數並且沒有指定GROUP BY子句。 SQLSTATE = 42803

有人可以幫忙嗎?

+0

您應該用正在使用的數據庫標記問題。 –

回答

0

您應該學會使用正確的join語法(儘管這與您的錯誤沒有任何關係)。簡單的規則:從不from子句中使用逗號。 總是使用明確的join語法。

您的問題是由於select中的外部列不在group by中。另外,您不需要子查詢:

SELECT P.NAME, SUM(TIMESTAMPDIFF(4,CHAR(TIMESTAMP(M.ENDTIME)-TIMESTAMP(M.START)))) AS MINUTES 
    FROM ROSTER R JOIN 
     PLAYER_ON P 
     ON R.CALL = P.CALL AND R.PID = P.PID JOIN 
     MATCH M 
     ON M.START = R.START 
    GROUP BY NAME 
+0

給出的語法沒有明顯的問題。在Oracle 11之前,Oracle不支持ANSI連接語法。許多用戶和許多示例使用傳統的Oracle語法。 –

+0

非常感謝!我會嘗試使用連接而不是從子句。但是我仍然感到困惑,當我在開始時在P.NAME前添加R.CALL時,未指定'CALL'。你能告訴我原因嗎? –

+0

@KenGeis。 。 。 Oracle至少支持15年前發佈的Oracle 9i,因此支持正確的ANSI'join「語法。 –

0

您的查詢中有一些錯誤。首先,嘗試使用JOIN而不是FROM和WHERE來連接表。其次,您需要使用Having子句來總計總分鐘數。

SELECT r.CALL, p.NAME, r.PID, SUM (TIMESTAMPDIFF(4,CHAR(TIMESTAMP(m.ENDTIME)- TIMESTAMP(m.START)))) AS MINUTES 
    FROM ROSTER r INNER JOIN PLAYER_ON p ON r.call = p.call AND r.pid=p.pid INNER JOIN INNER JOIN MATCH m ON m.START = r.START 
    GROUP BY p.NAME 
    HAVING TIMESTAMPDIFF(4,CHAR(TIMESTAMP(m.ENDTIME)- TIMESTAMP(m.START))) 
    ORDER BY r.CALL ASC, p.NAME ASC; 
+0

謝謝,非常有幫助! –