【问题标题】:Show 0 if no data exists for month in SQL Server 2012如果 SQL Server 2012 中月份不存在数据,则显示 0
【发布时间】:2017-09-27 10:36:03
【问题描述】:

我目前正在处理一个查询,以显示我们在过去 2 年中完成的所有任务。

这是我的查询

SELECT 
    SigD.actualCompletionDate,
    MONTH(SigD.actualCompletionDate) AS [Month Completed],
    YEAR(SigD.actualCompletionDate) AS [Year Completed]
FROM 
    [BPS].[dbo].tbl_buildLoanSignificantDate AS SigD
INNER JOIN 
    tbl_buildLoan AS bl ON SigD.BuildloanId = bl.BuildloanId
INNER JOIN 
    tbl_buildLoanMortgage AS blm ON SigD.BuildloanId = blm.BuildloanId
INNER JOIN 
    tbl_Broker AS brk ON bl.BrokerId = brk.BrokerId
LEFT JOIN 
    tbl_firmNetwork AS firm ON brk.firmNetworkID  = firm.firmNetworkID
WHERE 
    SigD.actualCompletionDate BETWEEN '01/01/2016' AND GETDATE() 
    AND blm.mortgageStatusID = 7 
    AND bl.caseTypeID = 2
    AND firm.name = 'First Complete'

我遇到的问题是显示我们没有完成的月份。

这是我的查询结果

actualCompletionDate    Month Completed Year Completed
------------------------------------------------------
2016-05-12                     5               2016
2016-01-21                     1               2016
2016-05-26                     5               2016
2016-04-12                     4               2016
2016-08-22                     8               2016
2017-07-26                     7               2017
2016-05-19                     5               2016

我想要显示年份中的每个月(2016 年和 2017 年);如果那个月没有完成,那么我需要显示那个月的0

我希望我已经在这里解释了自己。

干杯 生锈的

【问题讨论】:

    标签: sql date count


    【解决方案1】:

    你可以试试这个。

    ;WITH FULLDATE AS (
    SELECT * FROM 
        (VALUES(2016),(2017)) YEARS(Y) CROSS JOIN
        (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) MONTHS(M)
    )
    SELECT 
        X.actualCompletionDate,
        F.M AS [Month Completed],
        F.Y AS [Year Completed]
    FROM 
        FULLDATE F
        LEFT JOIN (
            SELECT 
            SigD.actualCompletionDate,
            Month(SigD.actualCompletionDate) AS [Month Completed],
            YEAR(SigD.actualCompletionDate) AS [Year Completed]
            FROM 
            [BPS].[dbo].tbl_buildLoanSignificantDate AS SigD 
            INNER JOIN tbl_buildLoan AS bl  ON SigD.BuildloanId = bl.BuildloanId
            INNER JOIN tbl_buildLoanMortgage AS blm ON SigD.BuildloanId = blm.BuildloanId
            INNER JOIN tbl_Broker AS brk ON bl.BrokerId = brk.BrokerId
            INNER JOIN tbl_firmNetwork AS firm ON brk.firmNetworkID  = firm.firmNetworkID
            WHERE SigD.actualCompletionDate BETWEEN '01/01/2016' AND GETDATE() 
                and blm.mortgageStatusID = 7 
                and bl.caseTypeID = 2
                and firm.name = 'First Complete'
        ) AS X ON F.M = X.[Month Completed] AND F.Y = X.[Year Completed]
        ORDER BY F.Y , F.M
    

    【讨论】:

    • Sarslan 这很有魅力,非常感谢您花时间回答
    【解决方案2】:

    在哪里显示0?您可以只加入包含所有预期日期的派生表:

    SELECT COALESCE(p.actualCompletionDate,<DefaultDate>) as actualCompletionDate,
     --replace <defaultDate> with what you want to show if there's no data in this month
           [s.Month],
           [s.Year]
    FROM (SELECT '1' as [month],'2016' as [year] 
          UNION ALL
          SELECT '2' ,'2016' 
          .... --As many dates as you need
          ) s
    LEFT JOIN (Your Query Here) p
     ON(p.month = s.[month completed] AND p.year = s.[year completed]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      • 2020-08-07
      • 2022-01-14
      • 1970-01-01
      相关资源
      最近更新 更多