2008-12-01 1 views
2

У меня есть таблица с набором данных из нескольких транзакций, каждый из которых состоит из подшагов, каждый из которых имеет время, в которое оно произошло. Могут быть переменные числа и порядок шагов.Excel - вычисление длительности временных данных, распределенных по нескольким строкам

Я хотел бы найти продолжительность каждой транзакции. Если я могу сделать это в Excel, тогда это здорово, поскольку он уже в этом формате. Если в Excel нет прямого способа сделать это, я загружу его в базу данных и сделаю анализ с помощью SQL. Если есть способ обойти это Excel это будет сохранить настройки несколько часов, хотя :)

Упрощенный пример моих данных выглядит следующим образом:

ТрансИД, подэтапе Время
1, стадия А, 15 : 00: 00
1, стадия В, 15:01:00
1, стадия С, 15:02:00
2, стадия В, 15:03:00
2, стадия С, 15:04 : 00
2, этап E, 15:05:00
2, этап F, 15:06:00
3, стадия С, 15:07:00
3, стадия D, 15:08:00
т.д.

Я хотел бы для получения результата устанавливается следующим образом:

ТрансИд, продолжительность
1, 00:02:00
2, 00:03:00
3, 00:01:00
т.д.

Моя первая попытка была с дополнительной колонкой с формулой вычитая время окончания из время начала, но с повторное количество шагов или те же начальные и конечные шаги, с которыми мне трудно понять, как эта формула будет работать.

Я также попытался создать сводную таблицу на основе этих данных с идентификатором в виде строк и времени в качестве данных. Я могу изменить настройки поля на данные времени, чтобы возвращать сгруппированные значения, такие как count или max, но я стараюсь посмотреть, как это можно настроить для отображения max (time) - min (time) для каждого идентификатора, следовательно, почему я думая о переходе к SQL. Если кто-нибудь может указать на что-то очевидное, то я буду очень благодарен.

Как предложил Хоббо, теперь я использовал сводную таблицу с TransID в качестве строк и дважды добавлял Time в качестве данных. После того, как вы установили параметры поля на «Время до максимума» на первом, а «Мин» на втором, формулу можно добавить за пределами сводной таблицы, чтобы рассчитать различия. Одна вещь, которую я пропустил здесь, это то, что одно и то же значение можно добавить в раздел данных более одного раза!

Последующая проблема заключалась в том, что формула, которую я добавляю, имеет вид = GETPIVOTDATA («Макс времени», $ A $ 4, «ID», 1) -GETPIVOTDATA («Мин времени», $ A $ 4 , «ID», 1), который затем не увеличивается при копировании и вставке. Решения для этого - либо использовать панель инструментов сводной таблицы, чтобы отключить формулы GETPIVOTDATA, либо вместо того, чтобы нажимать на сводную таблицу при выборе ячеек в формуле, вместо этого набирать ссылки на ячейки (например, = H4-G4)

ответ

1

Вы были на правильных линиях со сводными таблицами. Перетащите TransID в качестве поля строки, затем перетащите две копии времени в виде полей данных в сводной таблице; щелкните правой кнопкой мыши по каждому из них и укажите Min как функцию суммирования для одного и Max для другого. Справа от сводной таблицы добавьте формулу для вычисления разницы.

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

"Выглядит хорошо, единственная проблема, у меня есть то, что формула добавляю имеет форму = GETPIVOTDATA (" Макс времени, $ A $ 4, "ID", 1) - GETPIVOTDATA («Max of Time», «$ A $ 4», «ID», 1). Когда я копирую это в ячейки ниже, 1 не обновляется до 2, 3 и т. Д., Поэтому все они показывают одно и то же время. - Kris Coverdale «

Используйте эту кнопку на панели инструментов сводной таблицы, чтобы отключить формулы GETPIVOTDATA.

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

1

Возможно, что-то так же просто, как и такой запрос.

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

Я мог бы это сделать, если я загружу его в БД. Мне было интересно, могу ли я сделать это в Excel и просто что-то пропустить. Если нет, то сбивать небольшую базу данных, а импорт - это завтрашняя задача :) – 2008-12-01 21:29:04

+0

@kibbee, я думаю, вы можете иметь в виду «n», а не mi. – Fionnuala 2008-12-02 11:03:42

1

Чтобы добавить пост Кибби, в ссылаясь на комментарий, вы можете использовать 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 

EDIT: Я исправлены некоторые ошибки в исходное сообщение и изменил название из времени в MyTime. Время - это зарезервированное слово в SQL и вызывает трудности в запросах. Теперь это работает очень просто.

+0

Хорошая идея, мне она нравится. Он работает для простого запроса - например, «SELECT TransID FROM [Sheet1 $] GROUP BY TransID», но не для запроса: «SELECT TransID, DateDiff (mi, Min (Time), Max (Time)) AS Duration FROM [Sheet1 $] GROUP BY TransID ". Я предполагаю, что нужно делать с форматами времени, будет исследовать больше ... – 2008-12-01 22:24:14

+0

Спасибо за вашу помощь - у меня получились бы ответы с небольшой работой, я думаю, хотя сводная таблица избегает любой кодировки и работает, поэтому я буду использовать это на этот раз. Удобно знать об ADO с Excel - думаю, что я могу найти применение для этого в будущем! – 2008-12-02 10:36:22

0

Иногда можно сделать что-то один раз в Excel гораздо проще, чем что-то повторить.

Предполагая, что вы просто пытаетесь получить ответ один или два раза, а затем выбросите таблицу (в отличие от ее запуска каждую ночь или отдайте ее кому-то другому), вот как я это сделаю.

Я полагаю, ваши исходные данные в столбцах А, В и С, с заголовками в строке 1, а также данными, начинающиеся в строке 2.

сортировки таблицы ТрансИда в качестве первичного ключа, и времени в качестве дополнительного , оба восходящего. (Следующие действия не будут выполняться, если это не сделано.)

Добавить новый столбец 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, но не в формате, который вы хотите.

Выберите столбцы A-D и скопируйте их. Используйте специальную вставку для копирования значений только в новый лист.

Удалить столбец B и столбец C на новом рабочем листе, так что все осталось TransID и Duration.

Сортировка по длительности, чтобы привести все строки со значениями рядом друг с другом.

Сортируйте только строки со значениями TransId.

Voila, и есть ваше решение! Надеюсь, вам не нужно повторять это!

p.s. Это непроверено

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 после их редактирования.

2

В вашей формуле «GETPIVOTDATA» («Макс времени», $ A $ 4, «ID», 1) - GETPIVOTDATA («Макс времени», $ A $ 4, «ID», 1) «ссылки на ячейки адресуются между символ «$». Например, $ A $ 4. Когда ячейка ссылается на символ $, и вы копируете формулу в другую ячейку, тогда эталонные ячейки не обновляются автоматически. Следовательно, вы получаете тот же тип.

Возможно, вы измените формулу следующим образом, а затем скопируйте формулу в другие ячейки. Формула должна быть такой:

«GETPIVOTDATA» («Максимальное время», A4, «ID», 1) - GETPIVOTDATA («Максимальное время, A4,« ID », 1)».

Спасибо.

Смежные вопросы