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_Stored Procedures - Fatal编程技术网

Sql server 存储过程按日期分组为缺少的日期设置值

Sql server 存储过程按日期分组为缺少的日期设置值,sql-server,stored-procedures,Sql Server,Stored Procedures,在存储过程中,我返回按日期分组的总分钟数。日期范围是从昨天起一周。这个程序运作良好。然而,我面临一个问题。并非总是在这7天之间会有某一天的任何数据 例如,如果我今天运行我的过程,它会返回这个 **Min Date** 47 2014-08-03 153 2014-08-04 45 2014-08-05 166 2014-08-06 此人没有7月31日、8月1日和2日的任何数据。所以存储过程不会返回任何数据 我要做的是在数据库中没有记录的日子返回0 **Min Date** 0 20

在存储过程中,我返回按日期分组的总分钟数。日期范围是从昨天起一周。这个程序运作良好。然而,我面临一个问题。并非总是在这7天之间会有某一天的任何数据

例如,如果我今天运行我的过程,它会返回这个

**Min  Date**
47  2014-08-03
153 2014-08-04
45  2014-08-05
166 2014-08-06
此人没有7月31日、8月1日和2日的任何数据。所以存储过程不会返回任何数据

我要做的是在数据库中没有记录的日子返回0

**Min  Date**
0   2014-07-31
0   2014-08-01
0   2014-08-02
47  2014-08-03
153 2014-08-04
45  2014-08-05
166 2014-08-06
程序如下:

ALTER PROCEDURE [dbo].[getAgentChartData]
(
@ABID BIGINT
)

AS
BEGIN

SET NOCOUNT ON;

--RETURNING 7 DAYS WORTH OF DATA FROM YESTERDAY

DECLARE @TODAY AS DATE =GETDATE(),@WEEK AS DATE 

SET @WEEK =  DATEADD (DD, -8, @TODAY)

SELECT SUM(MINUTES) AS TOTALMINUTES, CONVERT(DATE, STARTDATE) AS DATE FROM PoLines 
    WHERE ADDRESSBOOKID = @ABID AND STARTDATE BETWEEN @WEEK  AND @TODAY
GROUP BY CONVERT(DATE, STARTDATE)


END
有什么建议吗

编辑*

补充了霍根的建议。仍然遇到问题

WITH Dates AS
(
SELECT DATEADD (DD, -7, GETDATE()) AS DAY
UNION ALL
SELECT DATEADD (DD, -6, GETDATE()) AS DAY
UNION ALL
SELECT DATEADD (DD, -5, GETDATE()) AS DAY
UNION ALL
SELECT DATEADD (DD, -4, GETDATE()) AS DAY
UNION ALL
SELECT DATEADD (DD, -3, GETDATE()) AS DAY
UNION ALL
SELECT DATEADD (DD, -2, GETDATE()) AS DAY
UNION ALL
SELECT DATEADD (DD, -1, GETDATE()) AS DAY
)
SELECT SUM(MINUTES) AS TOTALMINUTES, CONVERT(DATE, Dates.Day) AS DATE 
FROM Dates 
LEFT JOIN PoLines ON CONVERT(DATE, STARTDATE) = CONVERT(DATE, Dates.Day) 
WHERE ADDRESSBOOKID = @ABID 
GROUP BY CONVERT(DATE, Dates.Day)

在这样一个小例子中,我只是用一个CTE创建一个内联表。像这样:

WITH Dates AS
(
   SELECT DATEADD (DD, -8, GETDATE()) AS DAY
 UNION ALL
   SELECT DATEADD (DD, -7, GETDATE()) AS DAY
 UNION ALL
   SELECT DATEADD (DD, -6, GETDATE()) AS DAY
 UNION ALL
   SELECT DATEADD (DD, -5, GETDATE()) AS DAY
 UNION ALL
   SELECT DATEADD (DD, -4, GETDATE()) AS DAY
 UNION ALL
   SELECT DATEADD (DD, -3, GETDATE()) AS DAY
 UNION ALL
   SELECT DATEADD (DD, -2, GETDATE()) AS DAY
 UNION ALL
   SELECT DATEADD (DD, -1, GETDATE()) AS DAY
)
SELECT SUM(ISNULL(MINUTES,0)) AS TOTALMINUTES, CONVERT(DATE, Dates.Day) AS DATE 
FROM Dates 
LEFT JOIN PoLines ON CONVERT(DATE, STARTDATE) = CONVERT(DATE, Dates.Day) 
  AND ADDRESSBOOKID = @ABID 
GROUP BY CONVERT(DATE, Dates.Day)
因为您是从Dates表加入的,所以您将获得Dates表的所有元素以及PoLines表中存在的任何元素。然后,分组成员将把它滚动到7行

您还可以在数据库中设置要从中加入的日期表,并使用where子句限制日期范围这是一种标准做法


注意,我现在没有访问数据库的权限,因此我没有测试SQL,因为它可能有输入错误。

您需要在此处使用日历表。这样,您就可以从表中提取日期并连接到业务数据。这是你唯一能让它工作的方法。您面临的挑战是没有行,因此您必须从行所在的表开始。您也不需要日期表。您可以使用spt_值。e、 g.选择日期添加DD,编号*-1,从主日期获取日期。spt_值,其中类型='P'和编号>0,编号<9@ConradFrix-是的,那也行。我想我可以用一个长度大于或等于7的顺序列表来替换dates表。这似乎不太清楚。霍根,谢谢你的回复。我尝试了这个示例,但它没有返回任何数据。StartDate是DatetimeTry LEFT JOIN PoLines ON CONVERTDATE,StartDate=CONVERTDATE,Dates.Day如果有效,则将CTE更改为创建日期类型而不是日期时间