2013-04-30 99 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中,我认为这需要成为真正的桌面。只需创建一个并手动填充数字 - 您只需要一次。