SQL Group By в вычисляемом столбце - неверный идентификатор - PullRequest
1 голос
/ 05 апреля 2019

при экспорте данных из БД в клиент я сталкиваюсь с проблемой 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

Прежде чем вы спросите, да, даты сохраняются как целочисленные значения в формате ГГГГММДД.
Мой запрос работает, но я хотел бы получить что-то вроде:

exercice  codpro         QT
20190000  0828765332927  -1
20180000  0828765332927  -2

Итак, яЯ пытаюсь заказать по exercice, но Oracle ответит мне: 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

Ответы [ 2 ]

2 голосов
/ 05 апреля 2019

Я не знаю, почему вы использовали подзапрос (select TRUNC(datmvt,-4) from dual) для дат, когда вы можете сделать это без него.Вы можете сделать выбор из выбора, но этот синтаксис проще и должен выполнять эту работу:

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

демо

2 голосов
/ 05 апреля 2019

Вы можете ссылаться только на столбцы, существующие в наборе данных в вашем 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

Рабочий пример дляdbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...