SQL Server SUM存储过程获取几个月没有值的值

时间:2018-07-12 17:09:48

标签: sql-server stored-procedures

好,首先向所有开发人员问好,

这个问题我一直在苦苦挣扎,我有一个存储过程每月可以从我的客户那里收回债务,并将其显示在我的仪表板上,所以如果我有0个文档在1个月内没有偿还,那么我就不会将该月显示在我的图表上。

基本上我想获得当年的图表,就像现在我们在7月,我希望它显示从1月到7月的月份,如果有几个月的债务为0,那么我希望结果部署一个0。

我粘贴了存储的实际过程,所以我有一些经验更丰富的开发人员的指示,我已经在搜索此内容,但是我想不出来,非常感谢。

SELECT
        DATENAME(MONTH, [Documents].[Date]) AS 'Name',
        SUM([Documents].[Balance]) AS 'Value'
    FROM 
        [Documents]
    WHERE
        [Documents].[Balance] <> 0 AND
        [Documents].[MovementType] = COALESCE(@movementType, [Documents].[MovementType])
    GROUP BY
        DATENAME(MONTH, [Documents].[Date])

2 个答案:

答案 0 :(得分:0)

我可以通过使用COALESCETable Value Constructor来实现: Microsoft SQL Server 2008或更高版本支持“表值构造函数”:

SELECT
    DATENAME(MONTH, [Documents].[Date]) AS 'Name',
    COALESCE(SUM([Documents].[Balance]), 0) AS 'Value'
FROM 
    [Documents]
RIGHT JOIN 
  (Select v.valueId From (values ('January'), ('February'), ('March'), ('April'), ('May'), ('June'), ('July'), ('August'), ('September'), ('October'), ('November'), ('December')) v(valueId)) as vm 
  on vm.valueId = DATENAME(MONTH, [Documents].[Date])
WHERE
    [Documents].[Balance] <> 0 AND
    [Documents].[MovementType] = COALESCE(@movementType, [Documents].[MovementType])
GROUP BY
    DATENAME(MONTH, [Documents].[Date])

注意:我尚未测试过,但应该可以使用

答案 1 :(得分:0)

这可能也可以...

DECLARE @MONTH TABLE(Month INT)
DECLARE @COUNT INT

SET @COUNT = 0

WHILE @COUNT <> 12
BEGIN
 SET @COUNT = @COUNT + 1
 INSERT INTO @MONTH VALUES (@COUNT)
END

 SELECT m.Month AS 'Name',SUM(ISNULL([Documents].[Balance],0)) AS 'Value'
 FROM @MONTH m
 LEFT OUTER JOIN [Documents] ON m.Month = DATEPART(Month,[Documents].[Date])
 WHERE [Documents].[Balance] <> 0 AND
  [Documents].[MovementType] = COALESCE('', [Documents].[MovementType])
 GROUP BY  m.Month