【问题标题】:Error: Id must appear in group by clause, Postgresql?错误:ID 必须出现在 group by 子句中,Postgresql?
【发布时间】:2018-03-07 04:49:05
【问题描述】:

我有以下sql

SELECT *, min(okd.position) FROM

-- all deals
(SELECT * FROM "Deals" as d
WHERE (d.active = true) AND (d.latitude BETWEEN 40 AND 41) AND (d.longitude BETWEEN -75 AND -70)) AS okd

LEFT JOIN

-- used deals
(SELECT * FROM "Deals" as ad INNER JOIN
  (SELECT * FROM "DealsUsed" AS du WHERE du."CustomerId" = 1) AS rd
ON rd."DealId" = ad.id) as dd

--deals that were not used, grouped by user and sorted by position
ON dd."UserId" = okd."UserId" AND dd.position = okd.position
WHERE dd.id IS NULL
GROUP BY okd."UserId";

对我来说它看起来像有效的 sql

【问题讨论】:

  • 但是你得到一个错误吗?问题出在哪里?
  • 可能有效的是 MySQL,但很可能不在任何其他数据库中,例如您标记的那个。
  • 列出您的列。我们看不到* 中的内容。如果我们看不到您的查询有什么问题,我们将无法帮助您。

标签: sql postgresql sequelize.js


【解决方案1】:

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 子句,我计算的是每个部门的工资总和。

【讨论】:

  • 我确实想要所有其他列,我不明白需要分组吗?
  • 我通过添加示例编辑了我的消息;看一看。它演示了如果您在 GROUP BY 子句中包含(或不)包含列(在 SELECT 中使用)会发生什么。
  • 好吧抱歉,所以我一定是从我想要的开始,你告诉我的正在工作,但输出错误,错误的不是我想要的:你能检查一下stackoverflow.com/questions/49137542/how-to-write-sql-for-this跨度>
  • 我查看了您的另一个问题;如果您可以添加一些示例数据以及预期的输出,也许它会更容易提供帮助。目前,您发布了不同的表名和您编写的代码,因此具有误导性。我不明白那里的“业务”表是做什么用的。还有,这里已经很晚了,我要睡觉了,明天再看看。
  • 谢谢,基本上可以获得用户符合条件的所有交易。对于用户,每个企业将有一笔交易。 Biz 确实提供多种交易,但用户只能逐步获得它们。交易编号基于仓位.....假设 biz 有 5 个交易,仓位为0,1,2,3,4,那么如果用户使用仓位 0 的交易,现在用户有资格获得下一个编号 deal.position = 1。我的方法是获取所有企业的所有交易,删除用户使用过的所有交易,找到每个企业的最低位置交易(为什么我使用组)
猜你喜欢
  • 2016-04-03
  • 2020-02-08
  • 1970-01-01
  • 2020-11-04
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 2013-08-06
相关资源
最近更新 更多