VBA 访问日摘要查询
VBA Access Query for Day Summary
我一直使用这个论坛来寻求 VBA 帮助,但这是我第一次 post 自己做点什么。
我正在尝试制作一份报告,提供存储在 Access 中的各种警报的摘要。我想提供每天每个警报的简单计数。我使用了一些 SQL 查询,但实际上没有使用任何 Access。我接受了 Access 可以从 Access 本身做数据透视表的事实。如果有更好的方法,请告诉我。
Set CommandQuery.activeConnection = conn
commandQuery.CommandText = _
"TRANSFORM Count(FixAlarms.[Alm_NativeTimeLast]) AS CountOfAlm_NativeTimeLast " & _
"SELECT FixAlarms.Alm_Tagname, FixAlarms.Alm_Desc " & _
"FROM FixAlarms " & _
"WHERE ((FixAlarms.Alm_Tagname) <> """")) AND FixAlarms.Alm_NativeTimeIn > CellTime " & _
"GROUP BY FixAlarms.[Alm_Tagname], FixAlarms.Alm_Descr " & _
"PIVOT Format([Alm_NativeTimeIn],""Short Date"")"
rec.Open commandQuery
这是我正在使用的代码。我不得不重新打字,所以请原谅任何打字错误。它完成了我想要的大部分工作,但没有给我任何关于每一列是哪一天的指示。我需要在每一列上添加一个 header 以防有一天没有警报。我认为答案在 PIVOT 的 IN 部分,但如果没有语法错误,我无法让它工作。我以为我所要做的就是添加
PIVOT Format([Alm_NativeTimeIn],""Short Date"") IN 01/20/15"
如果可以请帮忙
谢谢。
为了获得全天的记录,即使是那些没有 activity 的记录,您也需要创建这些天。在访问中这样做的最简单方法是使用一组 UNION 语句为类似这样的日子创建一个假 table:
SELECT #2015-01-20# as dt FROM dual
UNION ALL
SELECT #2015-01-21# as dt FROM dual
UNION ALL
SELECT #2015-01-22# as dt FROM dual
如果您在 Access 中尝试上述查询,它将不起作用,因为没有 table 调用 dual
。您将必须创建它。检查 this SO 问题。
创建上述查询后,您可以将其与源 table 左联接。
TRANSFORM Count(FixAlarms.[Alm_NativeTimeLast]) AS CountOfAlm_NativeTimeLast
SELECT FixAlarms.Alm_Tagname, FixAlarms.Alm_Desc
FROM
(SELECT #2015-01-20# as dt FROM dual
UNION ALL
SELECT #2015-01-21# as dt FROM dual
UNION ALL
SELECT #2015-01-22# as dt FROM dual) as dates LEFT JOIN
FixAlarms ON DateValue(FixAlarms.[Alm_NativeTimeIn]) = dates.dt
WHERE ((FixAlarms.Alm_Tagname) <> """")) AND FixAlarms.Alm_NativeTimeIn > CellTime
GROUP BY FixAlarms.[Alm_Tagname], FixAlarms.Alm_Descr
PIVOT Format(dates.dt, 'Short Date')
编辑:我必须补充一点,这不是实现它的唯一方法。另一种方法是使用 Numbers
table。使用单个数字列 n
创建一个名为 Numbers
的 table 并用数字 0 到 100 填充它(取决于您希望包含在查询中的最大天数)。那么您对 dates
的查询将是:
SELECT DateAdd('d', n, #2015-01-20#) as dt FROM numbers where n < 30;
结果查询将是:
TRANSFORM Count(FixAlarms.[Alm_NativeTimeLast]) AS CountOfAlm_NativeTimeLast
SELECT FixAlarms.Alm_Tagname, FixAlarms.Alm_Desc
FROM
(SELECT DateAdd('d', n, #2015-01-20#) as dt FROM numbers where n < 30) as dates LEFT JOIN
FixAlarms ON DateValue(FixAlarms.[Alm_NativeTimeIn]) = dates.dt
WHERE ((FixAlarms.Alm_Tagname) <> """")) AND FixAlarms.Alm_NativeTimeIn > CellTime
GROUP BY FixAlarms.[Alm_Tagname], FixAlarms.Alm_Descr
PIVOT Format(dates.dt, 'Short Date')
当使用PIVOT columnName IN (ValueList)
时ValueList
是
- 括号内
- 引号
- 逗号分隔
所以你
PIVOT Format([Alm_NativeTimeIn],""Short Date"") IN 01/20/15"
需要成为
PIVOT Format([Alm_NativeTimeIn],""Short Date"") IN (""01/20/15"")
话虽如此,这不会在 IN 语句中使用 PIVOTS 过滤您的记录。您仍然需要使用 WHERE 子句。
如果最终目标是从左到右表示您的数据,那么这将起作用。但是,将此作为报告使用需要做很多额外的工作,因为您的控件不会绑定到可预测的列。列名称将根据不同的参数而改变。
您可以将其保留为传统查询(未旋转),这样报告起来会容易得多。如果您直接向用户显示网格或导出到 Excel 那么这不是问题。
所以,我只想在我的数据透视表 table 中添加一个 header,它会告诉我特定列的日期。
我没有显示的代码部分是我使用 rec.getrows 将我的所有数据移动到一个更简单的数组变量中。虽然它具有来自 Access 的所有数据,但它没有任何 header 来告诉我什么是标记名、什么是描述以及什么是日期。
我发现在 fields.item(n) 下的记录集中有一个 Name 属性。这个名字告诉我列数据的来源或数据的日期。使用这个和一个简单的日(日期)函数,我能够制作总结所有警报的月度报告。
感谢大家的帮助,但我对问题的描述不是很清楚,就是想多了。
我一直使用这个论坛来寻求 VBA 帮助,但这是我第一次 post 自己做点什么。
我正在尝试制作一份报告,提供存储在 Access 中的各种警报的摘要。我想提供每天每个警报的简单计数。我使用了一些 SQL 查询,但实际上没有使用任何 Access。我接受了 Access 可以从 Access 本身做数据透视表的事实。如果有更好的方法,请告诉我。
Set CommandQuery.activeConnection = conn
commandQuery.CommandText = _
"TRANSFORM Count(FixAlarms.[Alm_NativeTimeLast]) AS CountOfAlm_NativeTimeLast " & _
"SELECT FixAlarms.Alm_Tagname, FixAlarms.Alm_Desc " & _
"FROM FixAlarms " & _
"WHERE ((FixAlarms.Alm_Tagname) <> """")) AND FixAlarms.Alm_NativeTimeIn > CellTime " & _
"GROUP BY FixAlarms.[Alm_Tagname], FixAlarms.Alm_Descr " & _
"PIVOT Format([Alm_NativeTimeIn],""Short Date"")"
rec.Open commandQuery
这是我正在使用的代码。我不得不重新打字,所以请原谅任何打字错误。它完成了我想要的大部分工作,但没有给我任何关于每一列是哪一天的指示。我需要在每一列上添加一个 header 以防有一天没有警报。我认为答案在 PIVOT 的 IN 部分,但如果没有语法错误,我无法让它工作。我以为我所要做的就是添加
PIVOT Format([Alm_NativeTimeIn],""Short Date"") IN 01/20/15"
如果可以请帮忙
谢谢。
为了获得全天的记录,即使是那些没有 activity 的记录,您也需要创建这些天。在访问中这样做的最简单方法是使用一组 UNION 语句为类似这样的日子创建一个假 table:
SELECT #2015-01-20# as dt FROM dual
UNION ALL
SELECT #2015-01-21# as dt FROM dual
UNION ALL
SELECT #2015-01-22# as dt FROM dual
如果您在 Access 中尝试上述查询,它将不起作用,因为没有 table 调用 dual
。您将必须创建它。检查 this SO 问题。
创建上述查询后,您可以将其与源 table 左联接。
TRANSFORM Count(FixAlarms.[Alm_NativeTimeLast]) AS CountOfAlm_NativeTimeLast
SELECT FixAlarms.Alm_Tagname, FixAlarms.Alm_Desc
FROM
(SELECT #2015-01-20# as dt FROM dual
UNION ALL
SELECT #2015-01-21# as dt FROM dual
UNION ALL
SELECT #2015-01-22# as dt FROM dual) as dates LEFT JOIN
FixAlarms ON DateValue(FixAlarms.[Alm_NativeTimeIn]) = dates.dt
WHERE ((FixAlarms.Alm_Tagname) <> """")) AND FixAlarms.Alm_NativeTimeIn > CellTime
GROUP BY FixAlarms.[Alm_Tagname], FixAlarms.Alm_Descr
PIVOT Format(dates.dt, 'Short Date')
编辑:我必须补充一点,这不是实现它的唯一方法。另一种方法是使用 Numbers
table。使用单个数字列 n
创建一个名为 Numbers
的 table 并用数字 0 到 100 填充它(取决于您希望包含在查询中的最大天数)。那么您对 dates
的查询将是:
SELECT DateAdd('d', n, #2015-01-20#) as dt FROM numbers where n < 30;
结果查询将是:
TRANSFORM Count(FixAlarms.[Alm_NativeTimeLast]) AS CountOfAlm_NativeTimeLast
SELECT FixAlarms.Alm_Tagname, FixAlarms.Alm_Desc
FROM
(SELECT DateAdd('d', n, #2015-01-20#) as dt FROM numbers where n < 30) as dates LEFT JOIN
FixAlarms ON DateValue(FixAlarms.[Alm_NativeTimeIn]) = dates.dt
WHERE ((FixAlarms.Alm_Tagname) <> """")) AND FixAlarms.Alm_NativeTimeIn > CellTime
GROUP BY FixAlarms.[Alm_Tagname], FixAlarms.Alm_Descr
PIVOT Format(dates.dt, 'Short Date')
当使用PIVOT columnName IN (ValueList)
时ValueList
是
- 括号内
- 引号
- 逗号分隔
所以你
PIVOT Format([Alm_NativeTimeIn],""Short Date"") IN 01/20/15"
需要成为
PIVOT Format([Alm_NativeTimeIn],""Short Date"") IN (""01/20/15"")
话虽如此,这不会在 IN 语句中使用 PIVOTS 过滤您的记录。您仍然需要使用 WHERE 子句。
如果最终目标是从左到右表示您的数据,那么这将起作用。但是,将此作为报告使用需要做很多额外的工作,因为您的控件不会绑定到可预测的列。列名称将根据不同的参数而改变。
您可以将其保留为传统查询(未旋转),这样报告起来会容易得多。如果您直接向用户显示网格或导出到 Excel 那么这不是问题。
所以,我只想在我的数据透视表 table 中添加一个 header,它会告诉我特定列的日期。 我没有显示的代码部分是我使用 rec.getrows 将我的所有数据移动到一个更简单的数组变量中。虽然它具有来自 Access 的所有数据,但它没有任何 header 来告诉我什么是标记名、什么是描述以及什么是日期。
我发现在 fields.item(n) 下的记录集中有一个 Name 属性。这个名字告诉我列数据的来源或数据的日期。使用这个和一个简单的日(日期)函数,我能够制作总结所有警报的月度报告。
感谢大家的帮助,但我对问题的描述不是很清楚,就是想多了。