SELECT * 表示FROM 子句中涉及的表中的“给我所有列”。我认为它不仅仅是 UserId,还有一堆其他的列。哪个?不能告诉你SELECT * FROM "Deals"。考虑在任何地方避免SELECT *,但快速和肮脏测试目的。
因此,要么在 GROUP BY 子句中枚举所有这些(您可能不想要),要么在 SELECT 仅 UserId 以及聚合列;例如,
select okd."UserId", min(okd.position)
FROM (your current FROM clause)
group by okd."UserId"
[编辑,基于 Oracle(我有它),但也适用于您的数据库]
看看下面的例子:
这行得通 - 我正在选择在这些部门工作的所有员工的部门编号和工资总和:
SQL> select deptno, sum(sal)
2 from emp
3 group by deptno
4 order by deptno;
DEPTNO SUM(SAL)
---------- ----------
10 8750
20 6775
30 9400
我也想包括工作,即每个部门和工作的总工资。如果我在 SELECT 中包含一个新列但在 GROUP BY 中没有它,它将失败:
SQL> select deptno, job, sum(sal)
2 from emp
3 group by deptno
4 order by deptno;
select deptno, job, sum(sal)
*
ERROR at line 1:
ORA-00979: not a GROUP BY expression
因此,您有两种选择:
- 一个是恢复到第一个查询(即删除 JOB 并只有 DEPTNO),或者
- 在 GROUP BY 子句中包含附加列
SQL> select deptno, job, sum(sal)
2 from emp
3 group by deptno, job
4 order by deptno, job;
DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
20 ANALYST 3000
20 CLERK 800
20 MANAGER 2975
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600
[多一点]
还有一件事:有一种方法可以在不使用 GROUP BY 子句的情况下聚合值;在 Oracle 中,这就是分析函数的作用。我不知道你使用的数据库系统中是否有类似的东西,但你可以检查一下。这是一个例子:
SQL> select deptno, ename, job, sum(sal) over (partition by deptno) sum_sal_dept
2 from emp
3 order by deptno, job;
DEPTNO ENAME JOB SUM_SAL_DEPT
---------- ---------- --------- ------------
10 MILLER CLERK 8750
10 CLARK MANAGER 8750
10 KING PRESIDENT 8750
20 FORD ANALYST 6775
20 SMITH CLERK 6775
20 JONES MANAGER 6775
30 JAMES CLERK 9400
30 BLAKE MANAGER 9400
30 TURNER SALESMAN 9400
30 WARD SALESMAN 9400
30 ALLEN SALESMAN 9400
30 MARTIN SALESMAN 9400
看到了吗?如果没有 GROUP BY 子句,我计算的是每个部门的工资总和。