2013-04-30 84 views
1

Access 2010 here。MS-Access包含日期範圍查詢中的所有日期

回到另一個益智遊戲。我有這個查詢:

SELECT DischargeDatabase.Date, Avg([pH]) AS [pH Value], Avg([Temperature]) AS [Temperature (°C)], Avg([ZincLevel]) AS [Zinc (mg/l)], Sum([Effluent]) AS [Discharge (gal)], Count(*) AS [# Discharges] 
FROM DischargeDatabase 
WHERE DischargeDatabase.Date Between Forms!QueryForm!TextCriteriaQ0A And Forms!QueryForm!TextCriteriaQ0B 
GROUP BY DischargeDatabase.Date; 

從我一直在建設的廢水處理數據庫。這給出了廢水排放的日常總結,平均pH,溫度和鋅水平,並將排放量(流出物)相加。用戶使用日期選擇器在「QueryForm」的兩個文本框中選擇一個範圍,然後運行查詢。

顯示的是按日期分組的日期範圍內的放電,並且僅列出了具有放電的天數。用戶所要求的是每天選擇要顯示的範圍,而「DischargeDatabase」中沒有記錄的那些日期只有字段值爲零。

即從這個(日期範圍2013年4月11日至2013年4月16日,在一個週末):

Date  | ph Value | Temperature (°C) | Zinc (mg/l) | Discharge (gal) | # Discharges 
4/11/2013 9.5  18.6    0.89   5000    5 
4/12/2013 9.1  17.9    1.68   3000    2 
4/15/2013 8.9  19.6    1.47   10000    7 
4/16/2013 9.6  18.2    0.35   1500    1 

這樣:

Date  | ph Value | Temperature (°C) | Zinc (mg/l) | Discharge (gal) | # Discharges 
4/11/2013 9.5  18.6    0.89   5000    5 
4/12/2013 9.1  17.9    1.68   3000    2 
4/13/2013 0.0   0.0    0.0   0     0 
4/14/2013 0.0   0.0    0.0   0     0 
4/15/2013 8.9  19.6    1.47   10000    7 
4/16/2013 9.6  18.2    0.35   1500    1 

這一切,使得用戶可以將查詢粘貼到Excel電子表格中而不會出現問題。我甚至不確定這是可能的,還是在查詢的範圍內(您正在「選擇」不存在的記錄)。什麼可能工作是某種與預填充零的假表/查詢連接?

謝謝你的幫助和任何想法!

回答

1

這對於日曆表來說可能相當簡單。你可以使用custom CreateTable_calendar and LoadCalendar procedures建立你自己的。

創建一個基於日期範圍過濾日曆表的查詢,並將其過濾到您的其他表中。 (我在本例中簡化了SELECT字段列表。)

SELECT 
    c.the_date, 
    Count(ddb.Date) AS [# Discharges] 
FROM 
    tblCalendar AS c 
    LEFT JOIN DischargeDatabase AS ddb 
    ON c.the_date = ddb.Date 
WHERE 
    c.the_date Between 
      Forms!QueryForm!TextCriteriaQ0A 
     And Forms!QueryForm!TextCriteriaQ0B 
GROUP BY c.the_date; 
+0

我喜歡這個解決方案。無論試圖將參數傳遞給LoadCalendar還是傳遞任何參數,我都得到了「錯誤94 - 無效的空值使用」。但是,將intYear設置爲靜態「2013」​​,然後運行LoadCalendar子「工作」。不知道這是我的系統還是什麼,但年(日期)不適合我。現在查看修復程序。謝謝。 – Phizon 2013-04-30 19:41:08

+0

Doh,Year(Now())似乎有效,並且將在一年內改變。再次感謝你! – Phizon 2013-04-30 19:47:48

+0

我無法在'LoadCalendar'中找到問題。我很困惑爲什麼「年(日期)」出現問題。它給了我一個整數的2013年。 – HansUp 2013-04-30 20:28:39

1

你與你最後的聲明是正確的軌道!這種事情 - 即使沒有數據時也可以填充所有組 - 可以用我們稱之爲數字表格或統計表格(可以是CTE或真實表格)來完成,無論您想要做什麼。您可以展開CTE生成日期...

;WITH CTE AS (
    SELECT 1 as Num 
    UNION ALL 
    SELECT Num + 1 FROM CTE WHERE Num < @Max 
) 

SELECT * FROM CTE 

這種模式可以擴展到生成日期...

declare @startDate datetime 
set @startDate = getdate() --to start from today 

;WITH CTE AS (
    SELECT @startDate as myDate 
    UNION ALL 
    SELECT dateadd(day, 1, myDate) as myDate FROM CTE WHERE myDate < dateadd(day, 30, @startDate) 
) 

SELECT myDate FROM CTE 

現在,您可以使用CTE作爲在左表右外連接。在Access中,我認爲這需要成爲真正的桌面。只需創建一個並手動填充數字 - 您只需要一次。