【问题标题】:Python & PostgreSQL problem with GROUP BYGROUP BY 的 Python 和 PostgreSQL 问题
【发布时间】:2019-03-13 18:27:23
【问题描述】:

我在函数 view() 上遇到了一些问题。我收到错误:

列“store.id”必须出现在 GROUP BY 子句中或用于聚合函数中

例如:

name    number       quantity
plc        55              1
engine     66              1
plc        55              3

输出:

name    number       quantity
plc        55              4
engine     66              1

【问题讨论】:

  • 这是对 SQL 查询中聚合的基本误解。但为了提供帮助,我们需要知道您希望输出的样子。例如,当使用GROUP BY 时,结果将是每组一条记录——但可能有许多表行“落入”该组。你希望它们如何显示? (考虑id,可能有许多ids 都符合您的标准并最终归入同一组——您是否希望它们全部合并到一个“单元格”中?)
  • 我已经更新了我的帖子以澄清我的问题。
  • 回复:您的更新:SELECT name, number, SUM(quantity) 并按您未聚合的列(名称和编号)分组 - 所以 GROUP BY name, number。选择其他任何内容都需要您将其添加到 GROUP BY 的列表中或将其聚合(就像您使用 SUM(quantity) 一样)。
  • 是否有机会在不分组的情况下也收到一个ID?

标签: python sql postgresql psycopg2


【解决方案1】:

我想你正在寻找这样的东西:

SELECT
  name,
  producent,
  model,
  number,
  SUM(quantity),
  warehouse,
  location
FROM store
WHERE
  quantity > 0
GROUP BY
  name,
  producent,
  model,
  number,
  warehouse,
  location
ORDER BY
  number;

我从选定的字段中删除了id,因为您已经在前面的CREATE TABLE 语句中将其声明为UNIQUE (PRIMARY KEY) 字段(因为它是由您声明的序列自动递增的)。您永远不想在 UNIQUE 字段上进行分组 - 它只会为您提供与没有它时相同的结果。

但为了确定,我们需要知道您希望输出的样子。

这里有一条经验法则,当涉及到使用 SQL 对结果进行分组时:始终在 GROUP BY 子句中包含在聚合函数之外选择的所有字段。

更新

您已编辑您的问题,因此您包含的原始查询已消失。但看起来你已经包含了你想要的结果。以下是您获得这些的方式:

SELECT
  name,
  number,
  SUM(quantity) as "quantity"
FROM store
WHERE
  quantity > 0
GROUP BY
  name,
  number
ORDER BY
  number;

希望你能接受这样的回答。

【讨论】:

  • 嗨!我希望答案是有帮助的。请让我知道在这方面我是否可以提供其他帮助 - 或者接受答案?
【解决方案2】:

默认情况下,select 中的列应在 group by 子句中。 如上所述,您也可以将 select 中的所有列包含在 group by 中。 我还看到了一种替代方法,其中可以使用 sub query 来避免将所有列包含在 group by 中。 请参考此链接- previous answer for related issue

【讨论】:

    【解决方案3】:

    如下所示更改您的查询

    SELECT  name,  number,
     SUM(quantity) FROM store WHERE quantity>0 
     GROUP BY name,  number  ORDER BY number
    

    您还必须将非聚合的选定列放入group by

    【讨论】:

    • 如果您要将主键包含在按列分组的列表中,我不确定分组的意义...
    • @jedwards 回答在您编辑问题时已编辑,我提到您必须将列名按已选择但未汇总的列分组
    猜你喜欢
    • 2021-11-13
    • 1970-01-01
    • 2012-10-02
    • 2019-02-11
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 2019-04-30
    相关资源
    最近更新 更多