聚合列必须在

时间:2017-03-22 13:06:34

标签: postgresql

在postgresql中我无法执行此代码

SELECT name, SUM(sws) as sws,  SUM(sws) over (partition by sws)  swsrange FROM professoren
JOIN vorlesungen on persnr = gelesenvon
group by name
order by sws desc

错误代码是这样的:

  

FEHLER:Spalte»vorlesungen.sws«在GROUP-BY-Klausel erscheinen中发表的文章在einer Aggregatfunktion verwendet werden中   第1行:SELECT名称,SUM(sws)为sws,SUM(sws)结束(分区为s ...

这意味着他希望“sws”必须在聚合函数中或在聚合函数中(实际上是)。

更新

我把它改成了

SELECT name, SUM(sws) as swscount,  SUM(sws) over (partition by name)   swsrange FROM professoren
JOIN vorlesungen on persnr = gelesenvon
group by name, sws

输出是:

  

奥古斯丁,2,2- |康德,8,4 |波普,2,2- |罗素,2,5- |罗素,6,5 |苏格拉底,2,6- |苏格拉底,8,6

但它应该像第一列是名称,第二列是他给出的所有课程的总和(),第三列是排名最多的排名:

  

苏格拉底,10,1 |康德,8,2 |罗素,8,2 |奥古斯丁,2,3- |波普,2,3-

我在这里看不到问题。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

您指定了SUM(sws) over (partition by sws),但GROUP BY未指定sws。

在您编辑问题之后,它可能是您要找的吗?:

DROP TABLE T2;
CREATE TABLE T2 (NAME VARCHAR(20), SWSCOUNT INT)
;
INSERT INTO T2 VALUES ('Augustinus',2), ('Kant',8), ('Popper',2), ('Russel',2), ('Russel',6),('Sokrates',2),('Sokrates',8);

SELECT * FROM T2;

SELECT *, DENSE_RANK() OVER (ORDER BY swscount DESC) 
FROM (SELECT NAME, SUM(SWSCOUNT) AS SWSCOUNT 
      FROM T2
      GROUP BY NAME) X

输出继电器:

    name    swscount
1   Augustinus  2
2   Kant    8
3   Popper  2
4   Russel  2
5   Russel  6
6   Sokrates    2
7   Sokrates    8

    name    swscount    dense_rank
1   Sokrates    10  1
2   Kant    8   2
3   Russel  8   2
4   Popper  2   3
5   Augustinus  2   3