2

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

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

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

TransID, Substep, Time
1, step A, 15:00:00
1, step B, 15:01:00
1, step C, 15:02:00
2, step B, 15:03:00
2, step 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 作为行,时间作为数据。我可以更改时间数据的字段设置以返回分组值,例如计数或最大值,但我很难看到如何设置它以显示每个 ID 的 max(time) - min(time),因此我为什么正在考虑使用 SQL。如果有人能指出我遗漏的任何明显内容,我将不胜感激。

正如 Hobbo 所建议的,我现在使用了一个以 TransID 作为行的数据透视表,并两次添加了 Time 作为数据。在第一个的 Time to Max 和第二个的 Min 设置字段设置后,可以在数据透视表之外添加一个公式来计算差异。我在这里忽略的一件事是,可以多次将相同的值添加到数据部分!

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

4

6 回答 6

2

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

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

"GETPIVOTDATA("最大时间,A4,"ID",1) - GETPIVOTDATA("最大时间,A4,"ID",1)"。

谢谢。

于 2010-11-23T16:42:07.997 回答
1

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

SELECT TransID, DateDiff(mi, Min(Time),Max(Time)) AS Duration
FROM MyTable
GROUP BY TrandID
于 2008-12-01T21:26:08.303 回答
1

要添加到 Kibbee 的帖子,参考评论,您可以将 ADO 与 Excel 一起使用:

'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 中的保留字,会导致查询困难。这现在适用于一个非常简单的测试。

于 2008-12-01T21:55:12.690 回答
1

您在数据透视表的正确路线上。拖入 TransID 作为行字段,然后拖入两个 Time 副本作为数据透视表中的数据字段;右键单击每个并将 Min 指定为一个的汇总函数,将 Max 指定为另一个。在数据透视表的右侧添加一个公式来计算差异。

替代文字 http://img296.imageshack.us/img296/5866/pivottableey5.jpg

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

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

替代文字 http://img117.imageshack.us/img117/9937/pivottabletoolbarjn3.jpg

于 2008-12-02T08:15:27.447 回答
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。

于 2008-12-02T10:08:12.993 回答
0

有时,在 Excel 中做某事比重复做某事要容易得多。

假设您只是想得到一两次答案,然后扔掉电子表格(而不是每晚运行它,或者把它交给其他人运行),我会这样做。

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

按 T​​ransId 作为主键和 Time 作为辅助键对表进行排序,均按升序排列。(如果不这样做,以下将不起作用。)

添加一个新列 D,标题为 Duration ,其中包含这样的公式(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 列中,但不是您想要的格式。

选择 Columns AD 并复制它们。使用选择性粘贴将仅复制到新工作表中。

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

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

仅对具有 TransId 值的行进行排序。

瞧,这就是您的解决方案!希望你不需要重复这个!

ps 这是未经测试的

于 2008-12-01T21:55:58.993 回答