MS-Access包括日期范围查询中的所有日期

时间:2013-04-30 18:00:16

标签: sql ms-access jet

在这里访问2010。

回到另一个益智游戏。我有这个问题:

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"中没有记录的那些天。只有字段值为零。

即。从此(日期范围4/11/2013至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电子表格中。我甚至不确定这是否可行,或者在查询范围内(您是"选择"不存在的记录)。可能有用的是使用预先填充零的虚假表/查询进行某种连接?

感谢您的帮助和任何想法!

2 个答案:

答案 0 :(得分: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中,我认为这需要一个真正的表。只需创建一个并用数字手动填充它 - 你只需要这样做一次。

答案 1 :(得分:1)

使用日历表可以相当容易。您可以使用custom CreateTable_calendar and LoadCalendar procedures构建自己的。

创建一个查询,根据日期范围过滤日历表,并将LEFT JOIN过滤到您的其他表。 (我在此示例中简化了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;