Sql VBA访问日摘要查询
我一直使用这个论坛来获取VBA帮助,但这是我第一次自己发布一些东西 我试图制作一份报告,提供Access中存储的各种报警的摘要。我想提供每天每个警报的简单计数。我使用了一些SQL查询,但实际上没有使用任何访问。我认为Access可以从Access本身生成透视表。如果有更好的办法,请告诉我Sql VBA访问日摘要查询,sql,excel,vba,ms-access,pivot,Sql,Excel,Vba,Ms Access,Pivot,我一直使用这个论坛来获取VBA帮助,但这是我第一次自己发布一些东西 我试图制作一份报告,提供Access中存储的各种报警的摘要。我想提供每天每个警报的简单计数。我使用了一些SQL查询,但实际上没有使用任何访问。我认为Access可以从Access本身生成透视表。如果有更好的办法,请告诉我 Set CommandQuery.activeConnection = conn commandQuery.CommandText = _ "TRANSFORM Count(FixAlarms.[Alm_
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
如果可以的话,请帮忙
谢谢 为了获取全天的记录,即使是那些你这些天没有活动的记录也需要创建。在access中执行此操作的最简单方法是使用一组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的表。您必须创建它。检查一下这个问题
创建上述查询后,可以将其与源表保持连接
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')
在ValueList中使用PIVOT columnName时,ValueList为
括号内
引用
逗号分隔
所以你是
PIVOT Format([Alm_NativeTimeIn],""Short Date"") IN 01/20/15"
需要成为
PIVOT Format([Alm_NativeTimeIn],""Short Date"") IN (""01/20/15"")
尽管如此,这将不会使用语句中的数据透视来过滤记录。您仍然需要使用WHERE子句
如果最终目标是从左到右表示数据,那么这将起作用。但是,将此控件作为报表使用将需要大量额外的工作,因为您的控件不会绑定到可预测的列。列名将因不同的参数而更改
您可以将其作为一个传统的查询,而不进行数据透视,这样可以更轻松地报告它。如果您直接向用户显示网格或导出到Excel,则这不是问题。因此,我只想在透视表中添加一个标题,告诉我特定列的日期。 代码中没有显示的部分是,我使用rec.getrows将所有数据移动到一个更简单的数组变量中。虽然它拥有Access中的所有数据,但它没有任何标题来通知我什么是标记名、什么是描述以及什么是日期 我发现在fields.itemn下的记录集中有一个Name属性。这个名字告诉我列数据来自何处或数据的日期。通过使用这个和一个简单的daydate函数,我可以制作总结所有警报的月度报告
谢谢你们的帮助,伙计们,但我不是对问题的描述不清楚,就是想得太多了 谢谢你的回答。我不完全明白,既然我已经有一个日期栏要用,为什么我还要再写一个栏。实际上,只要每列都有一个标题,我就可以不使用空白列。然后我可以编写一个宏来放置它们并对它们进行排序。我不明白为什么Access这样做时查询有列名,但当我将其复制到VBA时却没有。可能这是我缺少的某个连接设置?如果没有范围内所有日期的数据,则该数据将不在select语句中。因此,当您转换此select语句时,将不会创建列,从而产生间隙。通过使用左连接,您可以确保至少创建了一行来表示缺少的日期。只需尝试上面的查询,看看它们是否能产生所需的结果
PIVOT Format([Alm_NativeTimeIn],""Short Date"") IN 01/20/15"
PIVOT Format([Alm_NativeTimeIn],""Short Date"") IN (""01/20/15"")