Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server求和存储过程,以获取没有值的月份的值_Sql Server_Stored Procedures - Fatal编程技术网

Sql server SQL Server求和存储过程,以获取没有值的月份的值

Sql server SQL Server求和存储过程,以获取没有值的月份的值,sql-server,stored-procedures,Sql Server,Stored Procedures,好的,首先,大家好 这个问题我一直在绞尽脑汁,我有一个存储过程,每月从我的客户那里获取债务,并将其显示在我的仪表板上,因此,如果我有0个1个月未支付的文档,那么我不会在图表上显示该月 基本上,我希望得到今年的图表,比如现在我们在7月份,我希望它显示从1月到7月的月份,如果有月份的债务为0,那么我希望结果是部署一个0 我粘贴了我的实际存储过程,所以我有一些来自更有经验的开发人员的指针,我已经搜索过了,但是我不能很好地理解它,提前非常感谢 SELECT DATENAME(MONTH,

好的,首先,大家好

这个问题我一直在绞尽脑汁,我有一个存储过程,每月从我的客户那里获取债务,并将其显示在我的仪表板上,因此,如果我有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])

我可以通过使用合并和表值构造函数来实现: 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])
注意:我还没有测试过它,但它应该可以工作

这也可以工作

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

最简单的方法是使用或创建一个月表,然后您可以使用外部联接。当您的Documents表已被使用一年以上时,您希望得到什么?您希望2018年1月和2019年1月的行一起计算吗?您是否认为您的表每月都会被清除以避免此问题?这是一个安全的假设吗?我将更改为存储过程以获取当前年份的数据,历史数据将保留,但图表将仅获取当前年份的数据。这是我使用此方法时遇到的错误:将nvarchar值“二月”转换为数据类型int时转换失败。将1,2,3更改为“一月”;这样的二月;好的,更改它可以使过程正常工作,但它仍然没有显示以0作为总和的月份。您是否使用了正确的联接。为此,它必须向您显示12条记录,即使我们没有匹配的记录扫描您是否共享表架构和示例记录?