Sql 从主表中没有值的联接表中获取值

Sql 从主表中没有值的联接表中获取值,sql,sql-server,Sql,Sql Server,下面显示的查询几乎正确,但我需要为每个会计Id设置一行,即在下面显示的输出中,第4行之后需要有一个新行,数据屏幕截图如下 我使用的查询是: SELECT a.companyId,a.profitCenterID,a.coaID,a.fiscalId, COALESCE(SUM(a.amount * -1),0) amount, twelveMo = ( SELECT COALESCE(SUM(amount * -1), 0) FRO

下面显示的查询几乎正确,但我需要为每个会计Id设置一行,即在下面显示的输出中,第4行之后需要有一个新行,数据屏幕截图如下

我使用的查询是:

    SELECT a.companyId,a.profitCenterID,a.coaID,a.fiscalId,
       COALESCE(SUM(a.amount * -1),0) amount,
       twelveMo = (
       SELECT COALESCE(SUM(amount * -1), 0)
       FROM gl a1
       LEFT OUTER JOIN fiscal f ON a1.fiscalId=f.Id
       WHERE  
           a1.companyId      =  a.companyId AND
           a1.profitCenterId =  a.profitCenterId AND
           a1.coaId          =  a.coaId AND
           f.Id              >  a.fiscalId - 12 AND 
           f.Id              <= a.fiscalId
        )
    FROM gl a
    INNER JOIN coa c ON c.Id=a.coaId AND c.statementType=4
    GROUP BY companyId,profitCenterId,coaId,a.fiscalId  
    ORDER BY companyId,profitCenterId,coaId,a.fiscalId

我不知道您的示例数据和模式,所以我只是在您的基础上添加了我的查询

;WITH CTE_NUM_TEMP AS 
(
    SELECT 1 AS Fiscal
    UNION ALL
    SELECT Fiscal+1 FROM CTE_NUM_TEMP
    WHERE Fiscal+1<=100
)

SELECT ISNULL(Der.companyId,1) AS companyId,ISNULL(Der.profitCenterID,1) AS profitCenterID,
ISNULL(Der.coaID,40000) AS coaID,IIF(twelveMo IS NULL,LAG(twelveMo,1) OVER(ORDER BY Fiscal),twelveMo) AS twelveMo
FROM CTE_NUM_TEMP AS Num
LEFT JOIN 
(
    SELECT a.companyId,a.profitCenterID,a.coaID,a.fiscalId,
    COALESCE(SUM(a.amount * -1),0) amount,
    twelveMo = (
    SELECT COALESCE(SUM(amount * -1), 0)
    FROM gl a1
    LEFT OUTER JOIN fiscal f ON a1.fiscalId=f.Id
    WHERE  
        a1.companyId      =  a.companyId AND
        a1.profitCenterId =  a.profitCenterId AND
        a1.coaId          =  a.coaId AND
        f.Id              >  a.fiscalId - 12 AND 
        f.Id              <= a.fiscalId
    )
    FROM gl a
    INNER JOIN coa c ON c.Id=a.coaId AND c.statementType=4
    GROUP BY companyId,profitCenterId,coaId,a.fiscalId  
)AS Der
ON Num.Fiscal=Der.fiscalId

提示:不要在外部SELECT的投影子句中使用SELECT子查询—这是SQL代码的味道。考虑将你的查询重构为FROM子集。你需要一个日历/计数表,它有你需要的所有行,然后加入。可能的示例数据的复制会很有帮助。