Excel - 计算跨多行传播的时间数据的持续时间

时间:2008-12-01 21:17:32

标签: excel pivot-table

我有一个电子表格,其中包含许多交易的数据集,每个交易都由子步骤组成,每个子步骤都有它发生的时间。可以有可变数量和步骤顺序。

我想查找每笔交易的持续时间。如果我可以在Excel中执行此操作那么很棒,因为它已经是那种格式。如果在Excel中没有直接的方法来执行此操作,我将把它加载到数据库中并使用SQL进行分析。如果有一个Excel方式围绕它,它将节省几个小时设置虽然:)

我的数据的简化示例如下:

TransID,子步,时间
1,步骤A,15:00:00
1,步骤B,15:01:00
1,步骤C,15:02:00
2,步骤B,15:03:00
2,步骤C,15:04:00
2,步骤E,15:05:00
2,步骤F,15:06:00
3,步骤C,15:07:00
3,步骤D,15:08:00

我想生成如下结果集:

TransID,持续时间
1,00:02:00 2,00:03:00 3,00:01:00 等

我最初的尝试是使用一个额外的列,其公式从开始时间减去结束时间,但没有重复的步骤数,或者相同的开始和结束步骤,我很难看到这个公式如何工作。

我还尝试根据此数据创建数据透视表,其中ID为行,Time为数据。我可以更改时间数据上的字段设置以返回分组值,例如count或max,但我很难看到如何设置它来显示每个ID的最大(时间) - 最小(时间),因此我为什么考虑前往SQL。如果有人能够指出我所遗漏的任何明显的东西,我会非常感激。

正如Hobbo所建议的那样,我现在使用带有TransID的数据透视表作为行,并且两次添加Time作为数据。在第一个时间设置为最大值并在第二个时间设置最小值时,可以在数据透视表外部添加公式以计算差异。我在这里忽略的一件事是,可以不止一次将相同的值添加到数据部分!

后续问题是我添加的公式是格式= GETPIVOTDATA(“Max of Time”,$ A $ 4,“ID”,1)-GETPIVOTDATA(“Min of Time”,$ A $ 4, “ID”,1),复制和粘贴时whici不会增加。对此的解决方案是使用数据透视表工具栏关闭GETPIVOTDATA公式,或者在公式中选择单元格时单击数据透视表,而是键入单元格引用(例如= H4-G4)

6 个答案:

答案 0 :(得分:2)

在您的公式中“GETPIVOTDATA(”最长时间,$ A $ 4,“ID”,1) - GETPIVOTDATA(“最长时间,$ A $ 4,”ID“,1)'单元格引用在符号“$”。例如$ A $ 4。当单元格引用具有$符号并将公式复制到其他单元格时,则不会自动更新引用单元格。因此你会得到相同的类型。

也许您按如下方式修改公式,然后将公式复制到其他单元格。公式应该是:

“GETPIVOTDATA(”最长时间,A4,“ID”,1) - GETPIVOTDATA(“最长时间,A4,”ID“,1)”。

感谢。

答案 1 :(得分:1)

也许就像这样的查询一样简单。

SELECT TransID, DateDiff(mi, Min(Time),Max(Time)) AS Duration
FROM MyTable
GROUP BY TrandID

答案 2 :(得分:1)

要添加到Kibbee的帖子,参考评论,您可以在Excel中使用ADO:

'From: http://support.microsoft.com/kb/246335 '

strFile = Workbooks(1).FullName
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

cn.Open strCon

strSQL = "SELECT TransID, DateDiff('n', Min([MyTime]),Max([MyTime])) AS Duration " _
         & "FROM [Sheet1$] GROUP BY TransID"

rs.Open strSQL, cn

'Write out to another sheet '
Worksheets(2).Cells(2, 1).CopyFromRecordset rs

编辑:我更正了原帖中的一些错误,并将时间列的名称更改为MyTime。时间是SQL中的保留字,会导致查询困难。这现在可以进行一个非常简单的测试。

答案 3 :(得分:1)

您使用数据透视表位于正确的位置。在TransID中作为行字段拖动,然后将两个时间副本作为数据字段拖动到数据透视表中;右键单击每个并指定Min作为一个的汇总函数,将Max指定为另一个。在数据透视表的右侧添加一个公式来计算差异。

alt text http://img296.imageshack.us/img296/5866/pivottableey5.jpg

“看起来很好,我唯一的问题是我添加的公式是形式= GETPIVOTDATA(”最大时间,$ A $ 4,“ID”,1) - GETPIVOTDATA(“Max of Time,$ 4美元,“ID”,1)。当我将其复制到下面的单元格时,1不会更新为2,3等,所以它们都显示相同的时间。 - Kris Coverdale“

使用数据透视表工具栏上的此按钮可以关闭GETPIVOTDATA公式。

alt text http://img117.imageshack.us/img117/9937/pivottabletoolbarjn3.jpg

答案 4 :(得分:1)

在excel中:

  A     B        C
1 1, step A, 15:00:00
2 1, step B, 15:01:00
3 1, step C, 15:02:00
4 2, step B, 15:03:00
5 2, step C, 15:04:00
6 2, step E, 15:05:00
7 2, step F, 15:06:00
8 3, step C, 15:07:00
9 3, step D, 15:08:00

11 1, =max(if($A$1:$A$9=$A11,$C$1:$C$9,"")-min(if($A$1:$A$9=$A11,$C$1:$C$9,"")
12 2, =max(if($A$1:$A$9=$A12,$C$1:$C$9,"")-min(if($A$1:$A$9=$A12,$C$1:$C$9,"")

注意:公式是数组函数,所以在编辑后按ctrl-shift-enter。

答案 5 :(得分:0)

有时可以在Excel中执行一次比重复执行操作更容易。

假设您只是试图获得一两次答案,然后扔掉电子表格(而不是每晚运行它,或者让其他人运行),这就是我要做的。

我假设你的原始数据在A,B和C列中,标题在第1行,数据从第2行开始。

按TransId作为主键对表进行排序,将Time作为次要键进行排序,均为升序。 (如果不这样做,以下情况将无效。)

添加一个标题为“持续时间”的新列,其中包含一个类似于此的公式(Excel公式没有格式化或注释;我已添加了这些列以帮助解释,但它们需要被删除):

=IF(B2=B3,           // if this row's TransId is the same as the next one
    "",              // leave this field blank
    C3-              // else find the difference between the last timestamp and...
     VLOOKUP(        // look for the first value
        A2,          // matching this TransId
        A:C,         // within the entire table,
        3)           // Return the value in the third column - i.e. timestamp
    )

现在您想要的数据位于D列,但不是您想要的格式。

选择列A-D并复制它们。使用“选择性粘贴”仅将复制到新工作表中。

删除新工作表中的B列和C列,所以剩下的就是TransID和Duration。

按持续时间排序,以使所有行的值彼此相邻。

仅按TransId对包含值的行进行排序。

Voila,有你的解决方案!希望你不需要重复这个!

P.S。这是未经测试的