Google sheets 展开/分解带有票证打开和关闭统计信息的Google Sheets表,以显示每个月打开的所有票证

Google sheets 展开/分解带有票证打开和关闭统计信息的Google Sheets表,以显示每个月打开的所有票证,google-sheets,google-sheets-formula,transpose,array-formulas,google-sheets-query,Google Sheets,Google Sheets Formula,Transpose,Array Formulas,Google Sheets Query,我的工作示例/谷歌工作表示例: 我有一个关于门票信息的源表。就这个问题而言,只有三个栏是重要的: 票号 门票开放日期 票据关闭日期——如果已关闭 根据这些信息,我需要生成具体月份的指标/报告: 那个月开的票 那个月关闭的票 已打开的票证(之前已打开但未关闭) 而且,我需要的是原始数据,而不仅仅是月度总结。也就是说,我应该能够选择一个月并显示符合上述三个标准的所有票证ID 使用此函数(我的示例表中的E-G列)可以很容易地获取前两个: 我被卡在第三个了。我正试图弄清楚如何在每个月都有一张票开着的

我的工作示例/谷歌工作表示例:

我有一个关于门票信息的源表。就这个问题而言,只有三个栏是重要的:

  • 票号
  • 门票开放日期
  • 票据关闭日期——如果已关闭
根据这些信息,我需要生成具体月份的指标/报告:

  • 那个月开的票
  • 那个月关闭的票
  • 已打开的票证(之前已打开但未关闭)
  • 而且,我需要的是原始数据,而不仅仅是月度总结。也就是说,我应该能够选择一个月并显示符合上述三个标准的所有票证ID

    使用此函数(我的示例表中的E-G列)可以很容易地获取前两个:

    我被卡在第三个了。我正试图弄清楚如何在每个月都有一张票开着的时候脱身。对于每个月开放的票据,应有一排,其中:

    • 第一列是月份
    • 第二栏是“开放”
    • 第三列是票证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    |
    
    注意:票据打开和关闭的月份也不会显示票据的“打开”。换句话说,一张票只能在以下月份“打开”:

    • 之后,不包括打开
    • 之前,不包括已关闭
    而且,如果一张票还没有关闭,那么到今天为止,每个月都会有一排

    我想我可以在公认的解决方案中使用这个概念来解决问题,但是由于数据的大小,我得到了一个错误。公式在我的样本表的I2中

    连接的文本结果超过50000个字符的限制

    所以我想知道是否有其他方法可以获得我需要的数据。我知道如何使用自定义函数实现这一点,但我希望尽可能避免使用自定义函数

    用解决方案更新 我能够得到的答案的关键部分,并使用它在我的原始解决方案。简而言之,与其使用
    CONCATENATE
    组合列/行,不如使用
    QUERY
    999^99
    作为标题计数(第三个参数),因为
    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
        )
    )
    
    =数组公式(
    质疑(
    分裂(
    转置(
    分裂(
    质疑(
    转置(
    修剪(
    质疑(
    如果(
    A2:A“任何人”,
    A2:A&“,”和EDATE(
    伊弗罗(
    分裂(
    报告(
    EOMONTH(B2:B,-1)+1&“,”,
    达特迪夫(
    月(B2:B,0)+1,
    月(
    如果(
    C2:C“,
    C2:C,
    EDATE(今天(),1)
    ),
    0
    ),
    “M”
    )
    ),
    ","
    ),
    0
    ),
    转置(
    划船(
    间接的(
    “A1:A”和最大值(
    如果(
    B2:B“,
    伊弗罗(
    达特迪夫(
    月(B2:B,0)+1,
    月(
    如果(
    C2:C“,
    C2:C,
    EDATE(今天(),1)
    ),
    0
    
    =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
        )
    )
    
    =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
        )
    )
    
    =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)))
    
    =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)))
    
    =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'"))