2015-11-04 35 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

谢谢,非常有帮助! –