按日期显示多个值的数据透视表
Posted
技术标签:
【中文标题】按日期显示多个值的数据透视表【英文标题】:Pivot table with multiple Values by Date 【发布时间】:2017-05-08 16:12:30 【问题描述】:我想知道是否找到了以下链接中的票证解决方案 Pivot on multiple fields and export from Access.
我正在尝试从以下格式的访问表中获取结果:V1(值 1)是一个数字,V2(值 2)是时间戳( hh:mm:ss
)。
基本上该报告会提取当月的数据,因此最终该月的每一天都会在顶部有一天,并且每一天都有相应的数字和时间值。
April 1 April 2 April 3
Manager V1 V2 V1 V2 V1 V2
John Doe 4 5:43:12 1 0:56:32 2 3:15:12
这是一个经过的时间。我一直在看艾伦布朗的帖子,我认为我的大部分方式都是这样。我创建了两个表:1)V1,这是一个拨号数; 2) V2 是 总通话时间。然后我使用了 Allen Browne 的方法,但我无法将时间格式设为hh:mm:ss
。在基表中就是这样,但无论我尝试什么,它似乎总是只显示 1 位数字。
TRANSFORM Sum(IIf([FldName]="DIALS",Val([DIALS].[DIALS]),
Val(Format([TALKTIME].[TT],"hh:nn:ss")))) AS TheValue
SELECT TALKTIME.Manager, DIALS.TW_Program_Code,
[DIALS]![VSE_FirstName] & " " & [DIALS]![VSE_Surname_Name] AS REP
FROM tblXtabColumns, TALKTIME
INNER JOIN DIALS
ON (TALKTIME.TW_Program_Code = DIALS.TW_Program_Code)
AND (TALKTIME.VSE_FirstName = DIALS.VSE_FirstName)
AND (TALKTIME.VSE_Surname_Name = DIALS.VSE_Surname_Name)
AND (TALKTIME.Period = DIALS.Period) AND (TALKTIME.[Manager] = DIALS.[Manager])
WHERE (((Month([TALKTIME].[Period])) = Month(Now())-1))
GROUP BY TALKTIME.Manager, DIALS.TW_Program_Code,
[DIALS]![VSE_FirstName] & " " & [DIALS]![VSE_Surname_Name]
PIVOT [DIALS].[Period] & " " & [FldName];
【问题讨论】:
你为什么在经过的时间上使用 Val() 函数? Val() 函数的目的是返回一个数字(整数或短整数,没有标点符号和字母)。 我刚刚在谷歌上搜索并尝试了一些东西。老实说,我迷失了。如果我什么都不放,我会收到数据类型不匹配错误 无法对文本值求和。如果经过的时间保存为秒,那么您应该将秒数相加而不格式化为 h:n:s。在所有算术计算完成后进行格式化。不要在那个 Iif() 中格式化。 确实,进行格式化的最佳位置是在表单或报告的文本框中。但是,基于 CROSSTAB 构建稳定的报表并非易事。 是否可以在使用 vba from access 创建每个输出 excel 文件的经过时间列后对其进行格式化?类似的东西 - 在文件夹 Temp 中 - 格式化任何工作簿中的任何列,其中列标题中包含 TT 可能达到这一点:) 【参考方案1】:是一天中的时间还是经过的时间?
查看http://allenbrowne.com/ser-67.html#MultipleValues。不能有多行标题。日期必须与提供 V1 和 V2 标头的字段连接。是否有一个字段可用于提供“V1”和“V2”标头?如果没有,计算它。一种方式:
SELECT *, DCount("*","Table1","Manager='" & [Manager] & "' AND ID <" & [ID])+1 AS Seq FROM Table1 WHERE Month([datefield]) = 4 AND Year([datefield])=2017;
现在在 CROSSTAB 中使用该查询。要么构建 2 个 CROSSTAB 查询并加入它们,要么使用 Allen Browne 方法。示例 CROSSTAB 仅旋转“V1”数据。
TRANSFORM First(Query1.Reading) AS DailyReading
SELECT Query1.Manager
FROM Query1
GROUP BY Query1.Manager
PIVOT Format([ReadDate],"mmm d") & " : " & [Seq] & "Reading";
【讨论】:
这是一个经过的时间。我一直在看艾伦布朗的帖子,我认为我的大部分方式都是这样。我创建了 2 个表(1 个用于 V1,它是一个拨号数),一个用于 V2(这是总通话时间)然后我使用 Allen Browne 的方法,但我无法获得时间格式为 hh:mm:ss .在基表中就是这样,但无论我尝试什么,它似乎总是只显示 1 位数字。 经过的时间是否在日期/时间字段中?可能使用 Format() 来稳定。格式([字段名],“hh:mm:ss”)。可能应该编辑您的原始帖子以显示那里的 SQL,然后删除两个 cmets。 它被创建为一个短文本字段,这是该字段从秒到 hh:mm:ss 的格式,它最终在一个表中作为短文本 TT: Format(Sum([CUST_TT]) *Val("0.000694444444")/60,"hh:nn:ss") 如果我从初始生成表查询中删除 TT: Format(Sum([CUST_TT])*Val("0.000694444444")/60,"hh:nn:ss") 并将其保留为秒(数据以什么形式出现)查询返回我想要的,除了它将经过的时间显示为秒而不是 hh:mm:ss 格式。 Transform步骤中返回数据的步骤也可以格式化吗?TRANSFORM Sum(IIf([FldName]="DIALS",CDbl([DIALS].[DIALS]),CDbl(([TALKTIME].[CUST_TT])))) AS TheValue
我认为不适合 Allen 的一体化查询方法。以上是关于按日期显示多个值的数据透视表的主要内容,如果未能解决你的问题,请参考以下文章