没有聚合的sql聚合

时间:2015-12-04 00:39:52

标签: sql sql-server

我想将SummonerName表中名为Summoner的列插入Order表。

我错误地说SummonerName是非聚合的。

我希望这个显示如下:

SummonerID OCC
94         5
1          4

为:

SummonerName SummonerID OCC
Paul         94         5
George       1          4

任何帮助都将不胜感激。

SELECT s.SummonerName, o.SummonerID, COUNT(o.SummonerID) AS 'OCC'    
FROM Orders AS o    
JOIN Summoner AS s    
    ON o.SummonerID = s.SummonerID    
GROUP BY o.SummonerID    
ORDER BY OCC;

4 个答案:

答案 0 :(得分:1)

您需要按照您选择的所有非聚合分组:

SELECT s.SummonerName, o.SummonerID, COUNT(o.SummonerID) AS 'OCC'    
FROM Orders AS o    
JOIN Summoner AS s    
    ON o.SummonerID = s.SummonerID    
GROUP BY o.SummonerID, s.SummonerName 
ORDER BY OCC;

或添加窗口功能并移除group by

SELECT s.SummonerName, o.SummonerID, COUNT(o.SummonerID) over (partition by o.SummonerID)  AS 'OCC' 
FROM Orders AS o    
JOIN Summoner AS s    
    ON o.SummonerID = s.SummonerID    
ORDER BY OCC;

答案 1 :(得分:0)

因为使用SQL,所选的每个未在GROUP BY中列出的列都必须应用聚合函数。某些SQL服务器(如MySQL)不会强制执行此操作并静默选择一个值。您应该将SummonerName添加到GROUP BY,或者将一个聚合函数(如MIN或MAX)添加到SELECT字段列表中的SummonerName列。

答案 2 :(得分:0)

与使用GROUP BY o.summonerID的方式相同,新的召唤者名称列必须是计算的结果(如MIN或MAX)或者在GROUP BY子句中。

将o.SummonerName添加到GROUP by子句中可能会得到您正在寻找的内容:

SELECT s.SummonerName, o.SummonerID, COUNT(o.SummonerID) AS 'OCC'    
  FROM Orders AS o    
  JOIN Summoner AS s ON o.SummonerID = s.SummonerID    
  GROUP BY s.SummonerName, o.SummonerID    
  ORDER BY OCC;

如果由于某种原因无法做到这一点,您可以将计算作为子选择,如下所示:

SELECT s.SummonerName, s.SummonerID, (SELECT COUNT(*) FROM Orders where SummonerID = s.SummonerID) AS 'OCC'    
  FROM Orders AS o     
  ORDER BY OCC;

答案 3 :(得分:0)

我会将s.SummonerName添加到GROUP BY子句中:

GROUP BY o.SummonerID,s.SummonerName