2014-10-02 114 views
0

,我有以下格式的数据之间的累计总数:查询到日期

Date  Value 
08/28  100 
09/01  1 
09/01  5 
09/10  2 

,我想我的输出是:

Date  Value 
08/28  100 
08/29  100 
08/30  100 
08/31  100 
09/01  106 
09/02  106 
. 
. 
. 
09/10  108 

我刚开始使用SQL,所以任何帮助将不胜感激。我现在所拥有的下面是,但那不是真正接近我所求:基于sgeddes建议

SELECT Date, COUNT(DISTINCT(Service)) AS Value 
     FROM [Directory] 
     WHERE Date <= @myDate 
     GROUP BY Date ORDER BY Date 
+0

我建议创建一个'dates'或'numbers'表。然后你可以使用'outer join'来实现你的结果。根据你的'RDBMS',有不同的方法。 – sgeddes 2014-10-02 15:32:44

回答

1

首先,你可以使用子查询来获得总价值

SELECT Date, (SELECT SUM(Value) FROM Directory d WHERE d.Date <= Directory.Date) 
FROM [Directory] 
WHERE Date <= @myDate 
ORDER BY Date 

这将使英语新看起来像这样的东西:

Date  Value 
08/28  100 
09/01  101 
09/01  106 
09/10  108 

然后,您可以添加一个日期表sgeddes建议。本文介绍了,如果还算不错:http://michaelmorley.name/how-to/create-date-dimension-table-in-sql-server

然后你就可以修改您的查询,像这样

SELECT DateTable.Date, (SELECT SUM(Value) FROM Directory d WHERE d.Date <= Directory.Date) 
FROM [Directory] LEFT OUTER JOIN DateTable on Directory.Date = DateTable.Date 
WHERE DateTable.Date <= @myDate 
ORDER BY DateTable.Date 

要得到你要寻找的数据格式。

+0

正是我在找什么 – wemblem 2014-10-02 20:32:42

0

SELECT a.Date,COUNT(DISTINCT(d.Service))AS值

FROM [Directory] d 
    LEFT OUTER JOIN [Date Table] a on d.Date = a.Date 
    WHERE Date <= @myDate 
    GROUP BY Date 
    ORDER BY Date 
+0

这仍然没有显示在[目录]中没有明确定义的中间日期... – wemblem 2014-10-02 16:36:02

0

使用下面的SQLSERVER脚本:

BEGIN 
--If exist then drop temp tables 
DROP TABLE #YOURTABLE; 
DROP TABLE #TEST1; 

DECLARE @MINDATE DATETIME; 
DECLARE @MAXDATE DATETIME; 

CREATE TABLE #YOURTABLE(
CDATE DATE, 
VALUE INT 
); 
INSERT INTO #YOURTABLE VALUES ('08/28/2014',100),('09/01/2014',1),('09/01/2014',5),('09/10/2014',100); 

--select start date and end date from your table 
SELECT @MINDATE=MIN(CDATE),@MAXDATE=MAX(CDATE) FROM #YOURTABLE; 

CREATE TABLE #TEST1(
CDATE DATE, 
VALUE INT 
); 

;WITH CALENDAR 
AS (
    SELECT @MINDATE CDATE 
    UNION ALL 
    SELECT CDATE + 1 
    FROM CALENDAR 
    WHERE CDATE + 1 <= @MAXDATE 
    ) 

-- insert all dates with 0 value in temp table 
INSERT INTO #TEST1 SELECT CDATE,0 FROM CALENDAR; 

--delete dates which are already there in your table 
DELETE FROM #TEST1 WHERE CDATE IN (SELECT CDATE FROM #YOURTABLE) 

-- insert all dates with values from your table to temporary table which holds dates which are not in your table 
INSERT INTO #TEST1 SELECT * FROM #YOURTABLE; 

    SELECT T1.CDATE,(SELECT SUM(VALUE) FROM #TEST1 T2 WHERE T2.CDATE<=T1.CDATE) FROM #TEST1 T1 
END