选择列表中的无效表达式(不包含在聚合函数或 GROUP BY 子句中)

Posted

技术标签:

【中文标题】选择列表中的无效表达式(不包含在聚合函数或 GROUP BY 子句中)【英文标题】:Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause) 【发布时间】:2019-05-17 18:20:31 【问题描述】:

我有这个查询,但是当我运行代码时,我收到了错误消息。

选择列表中的表达式无效(不包含在聚合函数或 GROUP BY 子句中)

谁能帮帮我?

查询如下:

SELECT
  obv.POS, 
  obv.CODVIDRO, 
  obv.PRENATW,
  obv.FASE, 
  obv.LARGURA,
  obv.ALTURA, 
  obv.QTDE,
  obv.OBS, 
  obv.AREAEMP, 
  obv.PESO,
  obv.CUSTO, 
  obv.CUSTOIPI, 
  obv.CODMATRIZ,
  IIF( obv.CODMATRIZ > '', obv.CODMATRIZ, obv.CODVIDRO ) as CodVidro2,                                                    
  vid.REF, 
  vid.DESCRICAO, 
  vid.PRENATV, 
  vid.ESPESSURA,
  obi.Subdiv, 
  obi.CodEsqd, 
  obi.Tipo, 
  obi.Obs, 
  obi.CodOracle, 
  obi.Localiz,
  IIF( pnw.Descricao > '', pnw.Descricao, obv.PRENATW ) as pnwDescricao,
  SUM(((OBV.LARGURA/1000)*(OBV.ALTURA/1000)*OBV.QTDE)) AS AREA,
  IIF(obv.CODVIDRO = 'V-ARAM-05',(SUM((((OBV.LARGURA/1000)*(OBV.ALTURA/1000)*OBV.QTDE))/3.57)), IIF(obv.CODVIDRO = 'V-MINB-04',(SUM((((OBV.LARGURA/1000)*(OBV.ALTURA/1000)*OBV.QTDE))/3.57)), (SUM((((OBV.LARGURA/1000)*(OBV.ALTURA/1000)*OBV.QTDE))/7.062)))) AS QTDECHAPAUNIT
FROM ObCalcV AS obv
LEFT JOIN Vidros vid ON (obv.CodVidro=vid.CodVidro)
LEFT JOIN ObItens obi ON (obv.ID_Obra=obi.ID_Obra AND obv.ItemObra=obi.ItemObra)
LEFT JOIN PreNat_W pnw ON (obv.PRENATW=pnw.PRENATW)
WHERE (obv.ID_OBRA = :ID_OBRA)
GROUP by obv.POS, 
  obv.CODVIDRO, 
  obv.PRENATW,
  obv.FASE, 
  obv.LARGURA,
  obv.ALTURA, 
  obv.QTDE,
  obv.OBS, 
  obv.AREAEMP, 
  obv.PESO,
  obv.CUSTO, 
  obv.CUSTOIPI, 
  obv.CODMATRIZ,                                                        
  vid.REF, 
  vid.DESCRICAO, 
  vid.PRENATV, 
  vid.ESPESSURA,
  obi.Subdiv, 
  obi.CodEsqd, 
  obi.Tipo, 
  obi.Obs, 
  obi.CodOracle, 
  obi.Localiz
ORDER BY CodVidro2, obv.PRENATW, obi.Tipo 

完整的错误如下:

无法格式化消息 13:896 -- 找不到消息文件 C:\Windows\firebird.msg。 动态 SQL 错误。 SQL 错误代码 = -104。 选择列表中的表达式无效(不包含在聚合函数或 GROUP BY 子句中)。

【问题讨论】:

猜测一下 - 没时间检查 - 您还需要将 pnw.Descricao 添加到 group by 中。 还有 QTDECHAPAUNIT 中使用的列 Error: Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)的可能重复 【参考方案1】:

这很容易检测到。毕竟你是程序员

https://docs.google.com/spreadsheets/d/1tBfebBKRIumJ0I3BaN2gNwGIMivc1wDJ-AVeohH0DCc/edit?usp=sharing

    您开始制作电子表格。 Microsoft Excel、OpenOffice、Gnumeric、MyOffice、Google Spreasheet - 任意。您需要非常基本的功能。

    您将select DB 列名复制到一个电子表格列中,并将group by 列名复制到另一行。

2.1。在将它们从 Stack Overflow 复制到 OpenOffice 后,它们在上面变成了一个单元格,所以我不得不使用“按列拆分数据”功能,因此对我来说,它们以行而不是列结束。阅读起来不太舒服,但变化不大。

2.2。请注意,您不需要列公式,所有这些表达式,您需要列名。

2.3。这种方法非常明显且非常简单,对于像Select aaa, x.aaa, tablename.aaa from tablename as x 这样的查询,它会看到三个不同的列。好吧,它会帮助您在查询中统一引用所有列。

    然后,您可以按字母表分别对电子表格的两个列(或者在我的情况下我对行进行排序)进行排序。

    现在您在这些列之间的列中插入简单公式,例如 B1 =A1=C1 并将其复制到整个列(或行)。

    现在您只需向下查看该列并检查“True”在何处更改为“False”。

该公式的剪切-移动-粘贴操作和恢复很少 - 您会发现所有不同步的列。

在您的情况下-您可以通过链接进行检查-不同步的第一列是CodVidro2-但是Group By 错过了它,所以没关系。因此,您将“按列排列”进一步移动一个单元格以恢复同步,并沿着线发现下一个位置 TRUE 变为 FALSE。

那将是您似乎缺少的 obv.POS DB 列。

稍后会有另外两列不同步,但它们也不会属于Group by,因此很可能无关紧要。

    注意,此方法非常简单,它不会发现表达式中提到的列(包括聚合函数)但未在select 列表中明确列出 - 除非您提取他们从那些表达。但是,对于那些不太简单的情况,您可以手动进行提取。对于 90% 的情况,电子表格(任何电子表格)都可以轻松为您进行比较。

【讨论】:

以上是关于选择列表中的无效表达式(不包含在聚合函数或 GROUP BY 子句中)的主要内容,如果未能解决你的问题,请参考以下文章

选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中

SQL:选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 子句中[关闭]

在 SQL 中使用 Group By 和 Aggregate - 获取错误“选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 中”

列“在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中”

列的原因在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中[重复]

列 'CM.PfmFolder.Id' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中