Разверните / разверните таблицу Google Sheets с статистикой открытия и закрытия билетов, чтобы показать все заявки, открытые каждый месяц. - PullRequest
1 голос
/ 01 февраля 2020

Мой рабочий пример / образец Google Sheet: https://docs.google.com/spreadsheets/d/1AvAb_qnrrexYl5W5wAW6aA6P552T-prBxoONOis-XZM/edit?usp=sharing

У меня есть исходная таблица с информацией о билетах. Ради этого вопроса есть только три столбца, которые имеют значение:

  • Идентификатор билета
  • Дата открытия билета
  • Дата закрытия билета - если он закрыт

Из этой информации мне нужно сгенерировать метрики / отчеты, которые показывают для определенного c месяца:

  1. Тикеты, которые были открыты в этом месяце
  2. Билеты, которые были закрыты в этом месяце
  3. Билеты, которые были открыты (открыт до и не закрыты)

И мне нужны необработанные данные, а не только ежемесячная сводка , Это значит, что я должен иметь возможность выбрать месяц и показать все идентификаторы билетов, соответствующие вышеуказанным трем критериям.

Получить первые два достаточно просто, используя эту функцию (столбцы EG в моем примере):

{
    QUERY(A2:C, "SELECT B, 'Opened', A WHERE A IS NOT NULL LABEL 'Opened' '' FORMAT B 'YYYY-MM'");
    QUERY(A2:C, "SELECT C, 'Closed', A WHERE C IS NOT NULL LABEL 'Closed' '' FORMAT C 'YYYY-MM'")
}

Я застрял на третьем. Я пытаюсь понять, как каждый месяц открывать билет. Для каждого месяца, в котором открыт билет, должна быть одна строка, в которой:

  • Первый столбец - месяц
  • Второй столбец - «Открыть»
  • Третий столбец - это ID билета

Например:

  • ID0010
    • , открытый в 2018-11
    • закрыто в 2019-01
    • открыто в:
      • 2018-12
  • ID0019
    • открыто в 2018-08
    • закрыто в 2019-03
    • открыто в:
      • 2018-09
      • 2018-10
      • 2018-11
      • 2018-12
      • 2019-01
      • 2019-02

станет:

| Month   | Status | Ticket ID |
|---------|--------|-----------|
| 2018-11 | Opened | ID0010    |
| 2018-12 | Open   | ID0010    |
| 2019-01 | Closed | ID0010    |
| 2018-08 | Opened | ID0019    |
| 2018-09 | Open   | ID0019    |
| 2018-10 | Open   | ID0019    |
| 2018-11 | Open   | ID0019    |
| 2018-12 | Open   | ID0019    |
| 2019-01 | Open   | ID0019    |
| 2019-02 | Open   | ID0019    |
| 2019-03 | Closed | ID0019    |

Примечание: месяц, в котором билет был открыт и закрыт, также не будет отображаться «Открыть» за билет. Другими словами, билет должен иметь только «Открыто» в месяцы:

  • После и не включая открытое
  • До и не включая закрытое

И, если билет еще не закрыт, то он будет по одной строке для каждого месяца до сегодняшнего дня.

Я подумал, что мог бы использовать концепцию в принятом решении для Формула Google Sheets для вычисления фактической общей продолжительности задачи с разными датами начала / окончания, перекрытиями и пробелами , но из-за размера данных я получаю сообщение об ошибке. Формула приведена в I2 моего образца.

Текстовый результат CONCATENATE длиннее, чем ограничение в 50000 символов.

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

обновление с решением

Я смог взять ключевые части player0 ответ и используйте его в моем первоначальном решении. Суть в том, что вместо использования CONCATENATE для объединения столбцов / строк используйте QUERY с 999^99 в качестве счетчика заголовков (3-й параметр), потому что QUERY тогда объединит все строки (с разделителем пробелов) ).

Окончательная формула:

=ARRAYFORMULA(
    QUERY(
        SPLIT(
            TRANSPOSE(
                SPLIT(
                    QUERY(
                        TRANSPOSE(
                            TRIM(
                                QUERY(
                                    IF(
                                        A2:A <> "",
                                        A2:A & "," & EDATE(
                                            IFERROR(
                                                SPLIT(
                                                    REPT(
                                                        EOMONTH(B2:B, -1) + 1 & ",",
                                                        DATEDIF(
                                                            EOMONTH(B2:B, 0) + 1,
                                                            EOMONTH(
                                                                IF(
                                                                    C2:C <> "",
                                                                    C2:C,
                                                                    EDATE(TODAY(), 1)
                                                                ),
                                                                0
                                                            ),
                                                            "M"
                                                        )
                                                    ),
                                                    ","
                                                ),
                                                0
                                            ),
                                            TRANSPOSE(
                                                ROW(
                                                    INDIRECT(
                                                        "A1:A" & MAX(
                                                            IF(
                                                                B2:B <> "",
                                                                IFERROR(
                                                                    DATEDIF(
                                                                        EOMONTH(B2:B, 0) + 1,
                                                                        EOMONTH(
                                                                            IF(
                                                                                C2:C <> "",
                                                                                C2:C,
                                                                                EDATE(TODAY(), 1)
                                                                            ),
                                                                            0
                                                                        ),
                                                                        "M"
                                                                    ),
                                                                    0
                                                                ),
                                                            )
                                                        )
                                                    )
                                                )
                                            )
                                        ) & ";",
                                    ),
                                    ,
                                    999^99
                                )
                            )
                        ),
                        ,
                        999^99
                    ) & " ",
                    "; "
                )
            ),
            ","
        ),
        "SELECT Col2, 'Open', Col1 WHERE Col2 > 4000 LABEL 'Open' '' FORMAT Col2 'YYYY-MM'",
        0
    )
)

обновление для использования SEQUENCE

=ARRAYFORMULA(
    QUERY(
        SPLIT(
            TRANSPOSE(
                SPLIT(
                    QUERY(
                        TRANSPOSE(
                            TRIM(
                                QUERY(
                                    IF(
                                        A2:A <> "",
                                        A2:A & "," & EDATE(
                                            IFERROR(
                                                SPLIT(
                                                    REPT(
                                                        EOMONTH(B2:B, -1) + 1 & ",",
                                                        DATEDIF(
                                                            EOMONTH(B2:B, 0) + 1,
                                                            EOMONTH(
                                                                IF(
                                                                    C2:C <> "",
                                                                    C2:C,
                                                                    EDATE(TODAY(), 1)
                                                                ),
                                                                0
                                                            ),
                                                            "M"
                                                        )
                                                    ),
                                                    ","
                                                ),
                                                0
                                            ),
                                            SEQUENCE(
                                                1,
                                                MAX(
                                                    IF(
                                                        B2:B <> "",
                                                        IFERROR(
                                                            DATEDIF(
                                                                EOMONTH(B2:B, 0) + 1,
                                                                EOMONTH(
                                                                    IF(
                                                                        C2:C <> "",
                                                                        C2:C,
                                                                        EDATE(TODAY(), 1)
                                                                    ),
                                                                    0
                                                                ),
                                                                "M"
                                                            ),
                                                            0
                                                        ),
                                                    )
                                                )
                                            )
                                        ) & ";",
                                    ),
                                    ,
                                    999^99
                                )
                            )
                        ),
                        ,
                        999^99
                    ) & " ",
                    "; "
                )
            ),
            ","
        ),
        "SELECT Col2, 'Open', Col1 WHERE Col2 > 4000 LABEL 'Open' '' FORMAT Col2 'YYYY-MM'",
        0
    )
)

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

ОБНОВЛЕНИЕ:

Я обновил свое решение, чтобы использовать своего рода метод ретабуляции, который я хотел бы использовать для преобразования 2D-массивов в наборы данных из двух столбцов. Эта формула ниже приведена в C1 на этом образце листа. Вы увидите аналогичную формулу в F1, которая пропускает взрыв и просто подсчитывает количество билетов по месяцам, если это является целью графика. Также в A1 есть небольшая формула, которая просто рассчитывает максимальную длину открытого билета в месяцах. Это используется в формуле несколько раз, так что визуально полезно иметь вспомогательную ячейку для нее. Его можно легко заменить на большие формулы вместо ссылки A1, если вы хотите избежать использования вспомогательных ячеек.

=ARRAYFORMULA(QUERY(VLOOKUP(SEQUENCE(COUNTA(Sheet1!A2:A)*A1,1,0)/A1+2,{ROW(Sheet1!A2:A),Sheet1!A2:A,IF(EDATE(EOMONTH(Sheet1!B2:B,-1)+1,SEQUENCE(1,A1,0))>EOMONTH(IFERROR(1/(1/Sheet1!C2:C),TODAY()),-1)+1,,EDATE(EOMONTH(Sheet1!B2:B,-1)+1,SEQUENCE(1,A1,0)))},MOD(SEQUENCE(COUNTA(Sheet1!A2:A)*A1,1,0),A1)*{0,1}+{2,3}),"where Col2 is not null label Col1'Ticket',Col2'Month'"))
0 голосов
/ 01 февраля 2020

те же логи c:

=ARRAYFORMULA(UNIQUE(QUERY(SPLIT(TRANSPOSE(SPLIT(QUERY(TRANSPOSE(QUERY(TRANSPOSE(
 "♦"&FILTER(A2:A, B2:B<>"", C2:C<>"")&"♠"&SPLIT(REPT(FILTER(B2:B, B2:B<>"", C2:C<>"")+1&"♣",
 NETWORKDAYS(FILTER(B2:B, B2:B<>"", C2:C<>"")+1, FILTER(C2:C, B2:B<>"", C2:C<>""))), "♣")+
 TRANSPOSE(ROW(INDIRECT("A1:A"&MAX(
 NETWORKDAYS(FILTER(B2:B, B2:B<>"", C2:C<>"")+1, FILTER(C2:C, B2:B<>"", C2:C<>"")))))-1)&"♠")
 ,,999^99)),,999^99), "♦")), "♠"),
 "select Col2,'Open',Col1 where Col2>4000 label 'Open''' format Col2 'YYYY-MM'", 0)))

0


ОБНОВЛЕНИЕ:

=ARRAYFORMULA(UNIQUE(QUERY(SPLIT(TRANSPOSE(SPLIT(QUERY(TRANSPOSE(QUERY(TRANSPOSE("♦"&
 FILTER(A2:A, B2:B<>"", C2:C<>"", MONTH(B2:B)<>MONTH(C2:C), YEAR(B2:B)<>YEAR(C2:C))&"♠"&EOMONTH(SPLIT(REPT(
 FILTER(B2:B, B2:B<>"", C2:C<>"", MONTH(B2:B)<>MONTH(C2:C), YEAR(B2:B)<>YEAR(C2:C))+1&"♣", DATEDIF(
 FILTER(B2:B, B2:B<>"", C2:C<>"", MONTH(B2:B)<>MONTH(C2:C), YEAR(B2:B)<>YEAR(C2:C))+1, 
 FILTER(C2:C, B2:B<>"", C2:C<>"", MONTH(B2:B)<>MONTH(C2:C), YEAR(B2:B)<>YEAR(C2:C)), "M")-1), "♣"),
 TRANSPOSE(ROW(INDIRECT("A1:A"&MAX(NETWORKDAYS(
 FILTER(B2:B, B2:B<>"", C2:C<>"", MONTH(B2:B)<>MONTH(C2:C), YEAR(B2:B)<>YEAR(C2:C))+1, 
 FILTER(C2:C, B2:B<>"", C2:C<>"", MONTH(B2:B)<>MONTH(C2:C), YEAR(B2:B)<>YEAR(C2:C))))))))&"♠")
 ,,999^99)),,999^99), "♦")), "♠"), 
 "select Col2,'Open',Col1 where Col2>4000 label 'Open''' format Col2 'YYYY-MM'", 0)))

0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...