sql - Oracle --> NOT A GROUP BY EXPRESSION 错误

标签 sql oracle

下面是我的查询。我不确定是什么原因导致 Not A group by expression 错误。任何帮助深表感谢。 =)

SELECT 
    DTA_PRODUCAO AS AF002_DTA_PRODUCAO
,   COD_MATERIAL AS AD001_COD_MATERIAL 
,   COD_FILIAL AS AD004_COD_FILIAL
,   NVL(SUM(DQTD_CONSUMOT),0)  AS AF002_DQTD_CONSUMOT
,  (SELECT NVL(SUM(DQTD_CONSUMOT),0) FROM MYDB.DSO_TERMICO M WHERE M.COD_FILIAL = D.COD_FILIAL AND M.CODPRO = D.COD_MATERIAL   AND M.ZTL_DATA >= SUBSTR(D.DTA_PRODUCAO,0,6)||'01' AND M.ZTL_DATA <= D.DTA_PRODUCAO) AS AF002_MQTD_CONSUMOT
,  (SELECT NVL(SUM(DQTD_CONSUMOT),0) FROM MYDB.DSO_TERMICO M WHERE M.COD_FILIAL = D.COD_FILIAL AND M.CODPRO = D.COD_MATERIAL   AND M.ZTL_DATA >= SUBSTR(D.DTA_PRODUCAO,0,4)||'0101' AND M.ZTL_DATA <= D.DTA_PRODUCAO) AS AF002_AQTD_CONSUMOT
FROM
    (SELECT 
       DTA_PRODUCAO
       ,CODPRO AS COD_MATERIAL 
       ,COD_FILIAL AS COD_FILIAL 
      , CASE WHEN DAUX.ZTL_DATA = TMP.DTA_PRODUCAO THEN DAUX.DIACONSUMO ELSE 0 END AS DQTD_CONSUMOT
      FROM MYDB.DSO_TERMICO DAUX
      INNER JOIN (SELECT DISTINCT MYDB.DSO_TERMICO.ZTL_DATA AS DTA_PRODUCAO FROM MYDB.DSO_TERMICO) TMP ON SUBSTR(TMP.DTA_PRODUCAO,1,4)=SUBSTR(DAUX.ZTL_DATA,1,4))
  D
  GROUP BY 
  DTA_PRODUCAO,
  COD_MATERIAL,
  COD_FILIAL
  ORDER BY 2,1; 

最佳答案

我想我明白发生了什么。这是您的子查询:

 (SELECT NVL(SUM(DQTD_CONSUMOT),0)
  FROM MYDB.DSO_TERMICO M
  WHERE M.COD_FILIAL = D.COD_FILIAL AND
        M.CODPRO = D.COD_MATERIAL   AND
        M.ZTL_DATA >= SUBSTR(D.DTA_PRODUCAO,0,6)||'01' AND 
        M.ZTL_DATA <= D.DTA_PRODUCAO
) AS AF002_MQTD_CONSUMOT

一切看起来都很干净。 where 中提到的三个字段位于group by 子句中。表达式 DQTD_CONSUMOT(重要的是 D.DQTD_CONSUMOT)不是,但它在 sum() 中。可能是什么问题?

问题是这是一个标量子查询。所以编译器只在子查询中解释 sum()。它说“这个子查询想要对 D.DQTD_CONSUMOT 求和,但这不是 group by 表达式。错误!”。

你可以通过分解出“常量”来解决这个问题:

 (SELECT count(*)
  FROM MYDB.DSO_TERMICO M
  WHERE M.COD_FILIAL = D.COD_FILIAL AND
        M.CODPRO = D.COD_MATERIAL   AND
        M.ZTL_DATA >= SUBSTR(D.DTA_PRODUCAO,0,6)||'01' AND 
        M.ZTL_DATA <= D.DTA_PRODUCAO
 ) *  NVL(SUM(DQTD_CONSUMOT),0) AS AF002_MQTD_CONSUMOT

我怀疑您也可以通过使用分析函数来解决这个问题。像这样的东西:

sum(DQTD_CONSUMOT) over (partition by D.COD_FILIAL, D.COD_MATERIAL, SUBSTR(D.DTA_PRODUCAO,0,6))

或类似的东西。没有样本数据和结果,很难弄清楚这一切到底在做什么。

关于sql - Oracle --> NOT A GROUP BY EXPRESSION 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21734790/

相关文章:

c# - 在 CodeBehind C# SQL 中访问 SCOPE_IDENTITY()

mysql - 将 blob 转换为 varchar 在 mysql 中返回 null

sql - SQL中如何根据多个 'tags'查询数据?

javascript - 根据复选框 oracle apex 禁用或启用按钮

mysql - 我怎样才能用SQL得到这两个郊区呢?

sql - 是否有任何已尝试和拒绝 CouchDB 的记录项目?

sql - 每行或每条语句的 MERGE 语句唯一索引/约束验证?

java - 甲骨文 JDBC 瘦 : enforce network encryption

database - 如何使用较旧的日期字段删除 SQL 中的重复行

linux - 当从 Linux 服务器中的 sqlplus 插入时,Windows-1252 (80-9F) 控制字符在 oracle db 中插入为 �