2016-05-12 39 views
0
SELECT 
    workdate, 
    SUM(Sam) ttlsam 
FROM 
    Sah 
WHERE 
    workdate BETWEEN '01 May 2016' AND ' 05 May 2016' 
GROUP BY 
    workdate 

我有執行上述命令,並結果是顯示空行

Workdate ttlsam 
02 may 10 
03 may 20 
04 may 40 

這裏01和05月05日未展示,因爲這兩個日期沒有任何數據。但我想要這樣。我的意思是,雖然01和05可沒有他們需要顯示0或ttlsam場空值

01 may 0 
02 may 10 
03 may 20 
04 may 40 
05 may 0 
+1

SQL不擅長數據顯示層(報告等)中的」填補空白「想要填寫數據中的空白,否則你需要一個「日期」表或你可以加入到你的_actual_數據中的東西 –

+1

你需要一個計數表,計數表是數據庫特定的,你使用哪一個 –

+0

你可以嘗試使用外部應用功能。該函數將負責計算SUM並返回每個工作日的該值。 – JVM

回答

1

這應該有希望幫助,如果你想這樣做在MS SQL

DECLARE @DateTable TABLE 
(
    DateValue DATE NOT NULL 
) 


DECLARE @StartDate DATE 
DECLARE @EndDate DATE 
DECLARE @WorkingDate DATE 

SET @StartDate = '01 MAY 2016' 
SET @EndDate = '30 MAY 2016' 

SET @WorkingDate = @StartDate 

WHILE @WorkingDate <= @EndDate 
BEGIN 

INSERT INTO @DateTable 
SELECT @WorkingDate 


SET @WorkingDate = DATEADD(DAY,1,@WorkingDate) 

END 



SELECT * FROM @DateTable 


DECLARE @tempData TABLE 
(
    workdate date 
    , Sam int 

) 


insert into @tempData 
SELECT 
    '01 MAY 2016', 
    10 


insert into @tempData 
SELECT 
    '01 MAY 2016', 
    10 

insert into @tempData 
SELECT 
    '03 MAY 2016', 
    10 



SELECT 
    dates.DateValue, 
    SUM(ISNULL(Sam,0)) ttlsam 
FROM 
    @DateTable dates 
    left join 
     @tempData Sah 
     on 
     dates.DateValue = sah.workdate 
WHERE 
    dates.DateValue BETWEEN '01 May 2016' AND ' 05 May 2016' 
GROUP BY 
    dates.DateValue 

數據這會產生這樣的:

DateValue ttlsam 
2016-05-01 20 
2016-05-02 0 
2016-05-03 10 
2016-05-04 0 
2016-05-05 0 

顯然不知道你實際的數據是我認爲有些事情和有限的數據集中到你最初發布什麼幕後的東西。

我所做的所有事情都是創建一個dates表,這是你用來作爲你的摘要表的例子,例如你需要的日期。我已經爲五月的前30天生成了它。但是你可以擁有一年的時間,只需更改開始日期和結束日期的值即可。

然後我們只是遍歷日期並將它們添加到表中。

完成此操作後,您將運行相同的查詢,但是會連接到您創建的此臨時表。然後它將對這些值進行分組和總和。如果沒有值存在,那麼它將執行ISNULL檢查並將零置於其位置。

希望這會有所幫助。

+0

通過使用master..spt_value DATEDIFF和DATE ADD,在SQL SERVER中創建沒有臨時表或迭代的Date Series是相當容易的。 [見此](http://data.stackexchange.com/stackoverflow/query/485324/calendar-tally-table) –

+0

親愛的大衛謝謝。實際上,我正在使用這樣一個記錄集,使用VB Creaters1(「從Sah選擇總和(Sam)」(日期在'01年5月2016年「和」2016年5月05日「按工作組分組)之間)。從這裏我想傳輸數據到excel工作表,但作爲01可能數據是空白的,這就是爲什麼02可能數據成爲01可能單元格。 –

0

爲了獲得無孔,適合時間序列,例如,用於繪圖ttlsamworkdate,你需要明確構建所有感興趣的日期。 An example for Oracle

然後,您可以爲每個關注日期而不是原始表格中的每個日期選擇您的Sam列的總和。 假設你已經填充的dates_of_interest表與d柱:

select d, sum(Sam) from dates_of_interest left outer join Sah on d=workdate group by d 
+0

感謝洛倫佐對我的工作 –

+0

嗨洛倫佐,對SAH表我想提出一個條件。如line_code,如'K%',line_code是SAH表中的列名。我該怎麼辦? –

0

選擇 dates.DateValue, SUM(ISNULL(SAM,0))ttlsam FROM @DateTable日期 左連接 @tempData薩 上 dates.DateValue = sah.workdate WHERE dates.DateValue BETWEEN '01 2016' 年5月與 '2016年5月5日' GROUP BY dates.DateValue。我想從SAH表中添加另一個條件,比如「line like'K%'我應該怎麼做。

+0

將您的條件添加到WHERE子句。左外連接的目的是爲「缺失」日期添加人造記錄;其次丟棄具有您不感興趣的日期的記錄;您可以完全像原始表格一樣過濾連接。 –