SQL查询如何在表中按名称分组
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
有人可以帮忙吗?
您应该学会使用正确的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
给出的语法没有明显的问题。在Oracle 11之前,Oracle不支持ANSI连接语法。许多用户和许多示例使用传统的Oracle语法。 –
非常感谢!我会尝试使用连接而不是从子句。但是我仍然感到困惑,当我在开始时在P.NAME前添加R.CALL时,未指定'CALL'。你能告诉我原因吗? –
@KenGeis。 。 。 Oracle至少支持15年前发布的Oracle 9i,因此支持正确的ANSI'join“语法。 –
您的查询中有一些错误。首先,尝试使用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;
谢谢,非常有帮助! –
您应该用正在使用的数据库标记问题。 –