2

多数のトランザクションのデータセットを含むスプレッドシートがあります。各トランザクションはサブステップで構成されており、それぞれが発生した時刻を持っています。ステップの数と順序は可変です。

各取引の期間を知りたいです。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 を行、時間をデータとしてピボット テーブルを作成してみました。時間データのフィールド設定を変更して、count や max などのグループ化された値を返すことができますが、ID ごとに max(time) - min(time) を表示するように設定する方法を理解するのに苦労しています。 SQLに向かうことを考えています。私が見逃している明らかなことを誰かが指摘できれば、とても感謝しています。

Hobbo が提案したように、TransID を行として使用し、データとして Time を 2 回追加したピボット テーブルを使用しました。最初に最大までの時間、2 番目に最小までのフィールド設定を設定した後、ピボット テーブルのすぐ外側に数式を追加して差を計算できます。ここで見落としていたことの 1 つは、同じ値をデータ セクションに複数回追加できることです。

追加の問題は、私が追加した式が =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)' では、セル参照は記号 "$ '。たとえば、$A$4 です。$記号を含むセルを参照し、数式を他のセルにコピーすると、参照セルは自動的に更新されません。したがって、同じタイプを取得します。

おそらく、次のように数式を変更してから、数式を他のセルにコピーします。式は次のようになります。

"GETPIVOTDATA("Max of Time, A4, "ID", 1) - GETPIVOTDATA("Max of Time, 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 の投稿に追加するには、コメントを参照して、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 の予約語であり、クエリで問題を引き起こします。これは非常に単純なテストで機能するようになりました。

于 2008-12-01T21:55:12.690 に答える
1

あなたはピボット テーブルで正しい方向に進んでいました。TransID を行フィールドとしてドラッグしてから、Time の 2 つのコピーをピボット テーブルのデータ フィールドとしてドラッグします。それぞれを右クリックし、一方の要約関数として 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

エクセルで:

  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 で何かを 1 回実行する方が、繰り返し実行するよりもはるかに簡単に実行できる場合があります。

答えを 1 回か 2 回取得しようとしているだけで、スプレッドシートを捨てる (毎晩実行したり、他の人に実行してもらうのではなく) と仮定すると、次のようになります。

生データが列 A、B、C にあり、見出しが行 1 にあり、データが行 2 から始まると仮定します。

TransId をプライマリ キーとして、Time をセカンダリ キーとして、両方とも昇順でテーブルを並べ替えます。(これをしないと次のことがうまくいきません。)

次のような数式で Duration というタイトルの新しい列 D を追加します (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 にありますが、必要な形式ではありません。

列 AD を選択してコピーします。のみを新しいワークシートにコピーするには、[形式を選択して貼り付け] を使用します。

新しいワークシートの列 B と列 C を削除すると、TransID と Duration だけが残ります。

期間で並べ替え、値を持つすべての行を隣り合わせにします。

値を持つ行のみを TransId で並べ替えます。

ほら、あなたの解決策があります!これを繰り返す必要がないことを願っています!

psこれはテストされていません

于 2008-12-01T21:55:58.993 に答える