我一直在使用这个论坛来获得VBA帮助,但这是我第一次自己发帖。
我正在尝试制作一份报告,其中提供了存储在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
这是我正在使用的代码。我不得不重新打字,所以请原谅任何错字。它完成了我想要的大部分内容,但它没有给我任何关于每列是什么日的指示。如果有一天没有警报,我需要在每列上添加标题。我认为答案在于PIVOT的IN部分,但我无法在没有语法错误的情况下使用它。我以为我所要做的就是加上
PIVOT Format([Alm_NativeTimeIn],""Short Date"") IN 01/20/15"
如果可以,请帮忙。
感谢。
答案 0 :(得分:0)
为了获取一整天的记录,即使是那些没有活动的记录,您也需要创建这些日子。在访问中执行此操作的最简单方法是使用一组UNION语句为与此类似的日期创建假表:
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中尝试上述查询,则无法使用,因为没有名为dual
的表。你必须创建它。检查this SO问题。
创建上述查询后,您可以使用源表LEFT JOIN。
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
表。创建一个名为Numbers
的表,其中包含一个数字列n
,并用0到100的数字填充它(取决于您希望包含在查询中的最大天数)。然后,您对dates
的查询将是:
SELECT DateAdd(&#39; d&#39;,n,#2015-01-20#)as dt FROM numbers其中n&lt; 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')
答案 1 :(得分:0)
使用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,那么这不是问题。
答案 2 :(得分:0)
所以,我只想在我的数据透视表中添加一个标题,告诉我特定列的日期。 我没有展示的部分代码是我使用rec.getrows将我的所有数据移动到一个更简单的数组变量中。虽然这有来自Access的所有数据,但它没有任何标题通知我什么是标记名,什么是描述,什么是哪个日期。
我发现在fields.item(n)下的记录集本身中有一个Name属性。这个名字告诉我列数据的来源或数据的日期。使用这个和简单的日期(日期)功能,我能够使我的月度报告汇总所有警报。
感谢您的帮助,但我要么对问题的描述不清楚,要么就是过度思考。