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
以上是我的查询,我成功从数据库中获取所需的列。
但是我还有一步之遥。 查询的示例输出如下: Output
我的问题是:如何按名称总计分组总数,例如,Edward Ellis将只输出一次,总分钟数为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子句中指定的 在GROUP BY子句中未指定HAVING子句或ORDER 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
答案 1 :(得分: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;