Sum 对于空结果,月份聚合为0

Sum 对于空结果,月份聚合为0,sum,aggregate,Sum,Aggregate,我见过类似的情况,但我无法实现: SELECT CNTRSINTDATA.DIM_CNTRS_DATE_ENTITY.CALENDAR_MONTH , CNTRSINTDATA.FACT_QUICKBOOKS_TRANS_TSI.TSI_NOMINAL_CODE , CNTRSINTDATA.DIM_CNTRS_TSI_COA.TSI_NOMINAL_ACC , CNTRSINTDATA.DIM_CNTRS_DATE_ENTITY.CNTRS_FIN_Y

我见过类似的情况,但我无法实现:

 SELECT 
      CNTRSINTDATA.DIM_CNTRS_DATE_ENTITY.CALENDAR_MONTH 
    , CNTRSINTDATA.FACT_QUICKBOOKS_TRANS_TSI.TSI_NOMINAL_CODE
    , CNTRSINTDATA.DIM_CNTRS_TSI_COA.TSI_NOMINAL_ACC
    , CNTRSINTDATA.DIM_CNTRS_DATE_ENTITY.CNTRS_FIN_YEAR
    , SUM (CNTRSINTDATA.FACT_QUICKBOOKS_TRANS_TSI.QB_TRANS_AMOUNT) AS CNTRS_ACC_BUDGET

FROM 
      CNTRSINTDATA.FACT_QUICKBOOKS_TRANS_TSI
    , CNTRSINTDATA.DIM_CNTRS_DATE_ENTITY
    , CNTRSINTDATA.DIM_CNTRS_TSI_COA

WHERE
    CNTRSINTDATA.FACT_QUICKBOOKS_TRANS_TSI.QB_TRANS_DATE = CNTRSINTDATA.DIM_CNTRS_DATE_ENTITY.CALENDAR_DATE
    AND CNTRSINTDATA.DIM_CNTRS_DATE_ENTITY.CNTRS_FIN_YEAR LIKE '2017'
    AND CNTRSINTDATA.FACT_QUICKBOOKS_TRANS_TSI.TSI_NOMINAL_CODE = CNTRSINTDATA.DIM_CNTRS_TSI_COA.TSI_NOMINAL_CODE
    AND CNTRSINTDATA.FACT_QUICKBOOKS_TRANS_TSI.TSI_NOMINAL_CODE = '6598'

GROUP BY
    CNTRSINTDATA.FACT_QUICKBOOKS_TRANS_TSI.TSI_NOMINAL_CODE
  , CNTRSINTDATA.DIM_CNTRS_TSI_COA.TSI_NOMINAL_ACC
  , CNTRSINTDATA.DIM_CNTRS_DATE_ENTITY.CALENDAR_MONTH
  , CNTRSINTDATA.DIM_CNTRS_DATE_ENTITY.CNTRS_FIN_YEAR;`
上述查询返回以下各项的结果:

Feb-17  250
Jul-17  400
Jun-17  654
May-17  654
Oct-17  150
Nov-17  250
Aug-17  250
九月十七日

我需要在剩下的几个月里也返回零的帐户,因为该月没有任何交易

Jan-17  0
Feb-17  250
Mar-17  0
Apr-17  0
Jul-17  400
Jun-17  654
May-17  654
Oct-17  150
Nov-17  250
Aug-17  250
Sep-17  0
Dec-17  0

有一个日期表,它将所有月份都作为VARCHAR2的日期。就是找不到正确的语法。有人能帮忙吗?

让我们把它分解一下,让它更易于管理。 首先,将其转换为SQL-92连接语法并添加一些别名

SELECT 
      dcde.CALENDAR_MONTH 
    , fqtt.TSI_NOMINAL_CODE
    , dctc.TSI_NOMINAL_ACC
    , dcde.CNTRS_FIN_YEAR
    , SUM (fqtt.QB_TRANS_AMOUNT) AS CNTRS_ACC_BUDGET
FROM 
  CNTRSINTDATA.FACT_QUICKBOOKS_TRANS_TSI fqtt
    INNER JOIN CNTRSINTDATA.DIM_CNTRS_DATE_ENTITY dcde
        ON fqtt.QB_TRANS_DATE = dcde.CALENDAR_DATE
  INNER JOIN CNTRSINTDATA.DIM_CNTRS_TSI_COA dctc
        ON AND fqtt.TSI_NOMINAL_CODE = dctc.TSI_NOMINAL_CODE
WHERE
        dcde.CNTRS_FIN_YEAR LIKE '2017'
  AND
        fqtt.TSI_NOMINAL_CODE = '6598'
GROUP BY
    fqtt.TSI_NOMINAL_CODE
  , dctc.TSI_NOMINAL_ACC
  , dcde.CALENDAR_MONTH
  , dcde.CNTRS_FIN_YEAR;
接下来,您说CNTRSINTDATA.DIM_CNTRS_date_实体中可能存在一个日期记录,所以将其交换

SELECT 
      dcde.CALENDAR_MONTH 
    , fqtt.TSI_NOMINAL_CODE
    , dctc.TSI_NOMINAL_ACC
    , dcde.CNTRS_FIN_YEAR
    , SUM (fqtt.QB_TRANS_AMOUNT) AS CNTRS_ACC_BUDGET
FROM 
    CNTRSINTDATA.DIM_CNTRS_DATE_ENTITY dcde
  INNER JOIN CNTRSINTDATA.FACT_QUICKBOOKS_TRANS_TSI fqtt
        ON fqtt.QB_TRANS_DATE = dcde.CALENDAR_DATE
  INNER JOIN CNTRSINTDATA.DIM_CNTRS_TSI_COA dctc
        ON AND fqtt.TSI_NOMINAL_CODE = dctc.TSI_NOMINAL_CODE
WHERE
        dcde.CNTRS_FIN_YEAR LIKE '2017'
  AND
        fqtt.TSI_NOMINAL_CODE = '6598'
GROUP BY
    fqtt.TSI_NOMINAL_CODE
  , dctc.TSI_NOMINAL_ACC
  , dcde.CALENDAR_MONTH
  , dcde.CNTRS_FIN_YEAR;
最后,您实际上不需要内部联接,因为这样可以消除不匹配的元组。在这种情况下,您需要一个左连接,因为您希望具有左值,即使右侧不存在任何值。您还需要将sum表达式合并为0,因为出于我无法理解的原因,SQL标准将只包含null的一堆记录的和定义为null

SELECT 
      dcde.CALENDAR_MONTH 
    , fqtt.TSI_NOMINAL_CODE
    , dctc.TSI_NOMINAL_ACC
    , dcde.CNTRS_FIN_YEAR
    , COALESCE(SUM (fqtt.QB_TRANS_AMOUNT), 0) AS CNTRS_ACC_BUDGET
FROM 
    CNTRSINTDATA.DIM_CNTRS_DATE_ENTITY dcde
  LEFT JOIN CNTRSINTDATA.FACT_QUICKBOOKS_TRANS_TSI fqtt
        ON fqtt.QB_TRANS_DATE = dcde.CALENDAR_DATE
  LEFT JOIN CNTRSINTDATA.DIM_CNTRS_TSI_COA dctc
        ON AND fqtt.TSI_NOMINAL_CODE = dctc.TSI_NOMINAL_CODE
WHERE
        dcde.CNTRS_FIN_YEAR LIKE '2017'
  AND
        fqtt.TSI_NOMINAL_CODE = '6598'
GROUP BY
    fqtt.TSI_NOMINAL_CODE
  , dctc.TSI_NOMINAL_ACC
  , dcde.CALENDAR_MONTH
  , dcde.CNTRS_FIN_YEAR;

尝试一下,看看这是否是您想要的

这里有一个可能的解决方案:

为目标期间生成假空交易记录 例如,使用CTE:

declare @StartDate datetime = '20170101'
declare @EndDate datetime  = '20171231'
;
with dt as
(
select @StartDate As 'thedate'
union all
select dateadd(month, 1, thedate) from dt where thedate < dateadd(month, -1, @EndDate)
) 
select 
    dt.thedate 'row date',
    datename(month,dt.thedate) 'Month', 
    YEAR(dt.thedate) 'Year',
    0 'Amount '
from dt
现在,您可以像UNIONALL一样将它们添加到事务表中,也可以对查询结果进行左连接和过滤。 我希望有帮助 @Adam G

谢谢你的建议。实际上,我从你的评论中得到了一个想法,并创建了一个select语句来获得我首先需要的所有月份。在那之后,我加入了一个select语句,在月份匹配的地方提取交易,并且它起作用。请参见下面的表格名称已更改

SELECT DISTINCT
    CNTRS_DATE_ENTITY.CALENDAR_MONTH
  , CNTRS_DATE_ENTITY.CNTRS_FIN_MONTH_POS
  , COALESCE (TRANS_DATA.TRANS_AMOUNT,0) AS TRANS_AMOUNT
FROM
    CNTRSINTDATA.DIM_CNTRS_DATE_ENTITY CNTRS_DATE_ENTITY 
LEFT JOIN 
    (
        SELECT
            QBS_TRANS_TSI.QB_NOMINAL_CODE
          , TO_CHAR(QBS_TRANS_TSI.QB_TRANS_DATE, 'Mon-YY') AS TRANS_MONTH
          , COALESCE (SUM(QBS_TRANS_TSI.QB_TRANS_AMOUNT),0) AS TRANS _AMOUNT
        FROM
            CNTRSINTDATA.FACT_QBS_TRANS_TSI QBS_TRANS_TSI
        WHERE 
            QBS_TRANS_TSI.TSI_NOMINAL_CODE = '6598'
        GROUP BY
            QBS_TRANS_TSI.QB_NOMINAL_CODE
          , TO_CHAR(QBS_TRANS_TSI.QB_TRANS_DATE, 'Mon-YY')
    ) TRANS_DATA
    ON TRANS_DATA.TRANS_MONTH = CNTRS_DATE_ENTITY.CALENDAR_MONTH

WHERE
    CNTRS_DATE_ENTITY.CNTRS_FIN_YEAR LIKE '2017'
ORDER BY
    CNTRS_DATE_ENTITY.CNTRS_FIN_MONTH_POS

但是,结果包含所有月份,但实体列中的和为零时为空。有什么补救办法吗?

编辑:我已经修改了答案,在求和表达式中加入了合并。否则,它将在该字段中显示null,而不是预期的零。