Подзапрос с суммой возвращает ноль - PullRequest
0 голосов
/ 28 октября 2019

Используя SQL Server, у меня есть запрос, который содержит подзапрос, предназначенный для обеспечения просмотра за 12 финансовых периодов.

Он возвращает только NULL, и я не смог определить, почему. Запрос ниже:

SELECT a.companyId,
       a.profitCenterId,
       a.coaId,
       a.fiscalId,
       sum(a.amount*-1) amount,

       twelveMo =
       (SELECT sum(amount*-1) FROM gl
       WHERE
       companyId=a.companyId AND
       coaId=a.coaId AND
       fiscalId>=a.fiscalId-12 AND fiscalId<fiscalId)

FROM
     gl a 
     INNER JOIN fiscal ON a.fiscalId=fiscal.Id
     INNER JOIN coa ON a.coaId=coa.Id
     WHERE coa.statementType=4
     GROUP BY a.companyId,a.profitCenterId,a.coaId,a.fiscalId
     ORDER BY a.companyId,a.profitCenterId,a.coaId,a.fiscalId

Результаты показаны ниже. Я ожидаю, что вместо NULLS я получу прогноз на 12 фискальных периодов.

Results of query

Ответы [ 3 ]

2 голосов
/ 28 октября 2019

Ваш подзапрос неправильно соотнесен с внешним запросом. Особенно, это никогда не будет соответствовать:

fiscalId<fiscalId

Вот новая версия для вашего запроса. Я использовал псевдонимы таблиц и префиксы столбцов везде :

select 
    a.companyId,
    a.profitCenterId,
    a.coaId,
    a.fiscalId,
    sum(a.amount * -1) amount,
    twelveMo = (
        select coalesce(sum(amount * -1), 0)
        from gl a1
        where 
            a1.companyid = a.companyid
            and a1.coaid = a.coaid
            and a1.fiscalid >= a.fiscalid - 12 and a1.fiscalid < a.fiscalid
        )
from
    gl a 
    inner join fiscal f on a.fiscalid = f.id
    inner join coa c on a.coaid = c.id on c.statementtype = 4
    group by a.companyid, a.profitcenterid, a.coaid, a.fiscalid
    order by a.companyid, a.profitcenterid, a.coaid, a.fiscalid

Примечание: условие на coa.statementtype лучше поместить в предложение on соответствующего join, чем вwhere пункт.

0 голосов
/ 28 октября 2019

Вы не указали все свои предикаты в предложении WHERE в подзапросе.

В частности, вы запрашиваете строки, в которых fiscalId < fiscalId

Мои предположения основаны на информацииВы указали, что хотите, чтобы оно было либо fiscalId < a.fiscalId, либо a.fiscalId < fiscalId

. Это хорошая идея, если вы используете одну и ту же таблицу в нескольких местах (или в любом случае используете псевдоним для одной таблицы). ) использовать псевдонимы для всех таблиц в запросе, чтобы было легко определить, какие столбцы вы вызываете из каких таблиц.

0 голосов
/ 28 октября 2019

Выполнение sum() на нулевых строках вернет ноль. В этом случае ваш подзапрос для столбца twelveMo имеет предложение where:

fiscalId<fiscalId

Это никогда не вернет никаких строк, и, таким образом, ваш sum вернет ноль.

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