2014-10-02 111 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