SQL查询如何在表中按名称分组

时间:2015-11-04 02:07:26

标签: sql sql-server database

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

有人可以帮忙吗?

2 个答案:

答案 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;