使用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。
答案 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.fiscalId
或a.fiscalId < fiscalId
如果您要在多个位置使用同一个表(或者始终为一个表使用别名)来对查询中的所有表使用别名,则是一个好主意,这样很容易确定从哪个表中调用哪个列表。