1

在此处访问 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”中没有记录的那些日子的字段值只有零。

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

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

4

2 回答 2

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 中,我认为这需要是一个真实的表。只需创建一个并用数字手动填充它 - 您只需执行一次。

于 2013-04-30T18:49:30.527 回答
1

使用日历表可以很容易做到这一点。您可以使用自定义 CreateTable_calendar 和 LoadCalendar 过程构建您自己的。

创建一个查询,该查询根据日期范围过滤日历表并将其过滤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;
于 2013-04-30T18:56:05.287 回答