在这里访问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电子表格中。我甚至不确定这是否可行,或者在查询范围内(您是"选择"不存在的记录)。可能有用的是使用预先填充零的虚假表/查询进行某种连接?
感谢您的帮助和任何想法!
答案 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;