总和的子查询返回null

时间:2019-10-28 15:24:15

标签: sql sql-server

使用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

结果如下所示。我的期望是,我将获得连续的12个会计期间的回溯,而不是NULLS。

Results of query

3 个答案:

答案 0 :(得分:2)

您的子查询与外部查询未正确关联。特别是,这将永远不匹配:

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的{​​{1}}子句中,而不是join子句中。

答案 1 :(得分:0)

在零行上执行sum()将返回null。在这种情况下,您对twelveMo列的子查询具有一个where子句:

fiscalId<fiscalId

这将永远不会返回任何行,因此您的sum将返回null。

答案 2 :(得分:0)

您尚未在子查询的WHERE子句中限定所有谓词。

特别是您要在fiscalId < fiscalId

根据您提供的信息,我的猜测是您希望将其设为fiscalId < a.fiscalIda.fiscalId < fiscalId

如果您要在多个位置使用同一个表(或者始终为一个表使用别名)来对查询中的所有表使用别名,则是一个好主意,这样很容易确定从哪个表中调用哪个列表。