SQL Group By on计算列 - 无效标识符

问题描述 投票:1回答:2

当我将数据从DB导出到客户端时,我正面临一个SQL问题

我的工作要求是:

select 
    datmvt as DATE_MVT,
    (select TRUNC(datmvt,-4) from dual ) as exercice,
    codpro as CODPRO,
    SUM(qtemvt)-SUM(C01) as QT
from myTable
where codpro = 'XXX'
and datmvt BETWEEN YYYYMMDD and YYYYMMDD
GROUP BY datmvt, codpro
HAVING abs(SUM(qtemvt)-SUM(C01)) > 0

给我这个结果:

DATMVT    exercice   codpro        QT
20190119  20190000  0828765332927  1
20190126  20190000  0828765332927  -1
20180117  20180000  0828765332927  -1
20180118  20180000  0828765332927  -1
20190122  20190000  0828765332927  1

在您提出之前,是的,日期以YYYYMMDD格式存储为整数值。 我的要求正在运作,但我希望有一些像:

exercice  codpro         QT
20190000  0828765332927  -1
20180000  0828765332927  -2

所以,我正试图通过exercice订购,但甲骨文回应我:00904. 00000 - "%s: invalid identifier"

这是我的非工作 - 但需要的要求:

select 
    (select TRUNC(datmvt,-4) from dual ) as exercice,
    codpro as CODPRO,
    SUM(qtemvt)-SUM(C01) as QT
from myTable
where codpro = 'XXX'
and datmvt BETWEEN YYYYMMDD and YYYYMMDD
GROUP BY exercice, codpro
HAVING abs(SUM(qtemvt)-SUM(C01)) > 0
sql oracle group-by
2个回答
2
投票

您只能引用GROUP BY中数据集中存在的列,因此您还需要在那里重复计算,例如:

select 
    TRUNC(datmvt,-4) as exercice,
    codpro as CODPRO,
    SUM(qtemvt)-SUM(C01) as QT
from myTable
where codpro = 'XXX'
and datmvt BETWEEN YYYYMMDD and YYYYMMDD
GROUP BY TRUNC(datmvt,-4), codpro
HAVING abs(SUM(qtemvt)-SUM(C01)) > 0

Working example on dbfiddle


2
投票

我不知道你为什么在没有它的情况下使用子查询(select TRUNC(datmvt,-4) from dual)作为日期。你可以从select中选择,但这种语法更简单,应该完成这项工作:

select trunc(datmvt,-4) exercice, codpro, sum(qtemvt)-sum(c01) qt
  from mytable
  where codpro = '0828765332927' and datmvt between 20150101 and 20191231
  group by trunc(datmvt, -4), codpro
  having sum(qtemvt) - sum(c01) <> 0

demo

© www.soinside.com 2019 - 2024. All rights reserved.