【问题标题】:Google Sheets - Transpose & QueryGoogle 表格 - 转置和查询
【发布时间】:2020-07-22 23:21:50
【问题描述】:

我们有一个相对较大的数据集,在下面的“当前格式”中大约有 26K 行和 24 列。但是,我们正在尝试将其重新格式化为以下所需的格式。我认为我们可能需要 Transpose 和 Query 来实现这一点,但我们对任何实现它的方法持开放态度。

任何关于如何重新格式化的建议将不胜感激。

【问题讨论】:

    标签: google-sheets google-sheets-formula array-formulas transpose


    【解决方案1】:

    JAK,需要处理大量数据。并且在不访问实际工作表和数据的情况下尝试编写公式总是很困难。也就是说,SPLIT/JOIN 组合会超出字符数限制。但理论上,以下公式可以工作(假设您的实际数据是您的示例的扩展并且从 A1:Y 运行。

    =ArrayFormula({"ID","Value","Qty"; QUERY({VLOOKUP(MOD(SEQUENCE(COUNTA(A:A)*COUNTA(A1:Y1),1)-1,COUNTA(A:A))+2,{ROW(A:A),A:A},2),HLOOKUP(ROUNDUP(SEQUENCE(COUNTA(A:A)*COUNTA(A1:Y1),1)/COUNTA(A:A))+1,{COLUMN(A1:Y1);A1:Y1},2),
    VLOOKUP(MOD(SEQUENCE(COUNTA(A:A)*COUNTA(A1:Y1),1,2)-2,COUNTA(A:A))+2,{ROW(A2:A),B2:Y},ROUNDUP(SEQUENCE(COUNTA(A:A)*COUNTA(A1:Y1),1)/COUNTA(A:A))+1)
    },"SELECT Col1, Col2, Col3 WHERE Col3 IS NOT NULL ORDER BY Col1 Asc")})
    

    如果您想在单独的工作表中进行设置,则需要编辑整个公式的每个范围,以包含原始数据所在工作表的名称。

    更多关于这个公式的基础和解释:https://www.benlcollins.com/spreadsheets/unpivot-in-google-sheets

    【讨论】:

    • Erik,您对实际数据的看法是正确的,很抱歉没有提供所有数据。认为这个例子可能太多了。您的公式看起来很棒,非常感谢您提供指向本柯林斯示例的链接,因为它看起来正是我们正在尝试做的。我明天要用新鲜的眼光试试这个。没想到它可能被称为 unpivot。
    • JAK,我刚刚注意到我上面写的部分公式是写到您的示例中的,而不是您的 A:Y 数据。我编辑了原始公式以适应 A:Y 范围。所以你可能想再试一次,就像现在写的那样。
    【解决方案2】:

    使用:

    =ARRAYFORMULA({"ID", "Value", "Qty"; 
     IFERROR(SPLIT(FLATTEN(IF(B3:D="",,A3:A&"♦"&B2:D2&"♦"&B3:D)), "♦"))})
    

    【讨论】:

    • 不错,player0。非官方 FLATTEN 的另一种用途。让我们希望谷歌能保留它。我每天都能找到它的新用途。
    • 这是一个非常有趣的公式,而且看起来效果很好。我将根据重新格式化的版本抽查我们的数据。快速提问公式中钻石的用途是什么?顺便说一下,Flatten 看起来很棒。
    • diamond 是唯一字符,split 使用它来将字符串切割成单元格,因此在此过程中它会被取消。你可以改用任何你想要的独特符号♥☺☻♫♀♂♠♣...
    • 另一个跟进公式。源数据在 ValueA、ValueB 和 ValueC 中有很多零值。我们如何仅在单元格大于 0 时重新格式化?
    • 这是一个巨大的帮助。非常感谢,它消除了我们不需要的超过 100K 行。
    【解决方案3】:

    您可以尝试以 .csv 格式下载表格并编写一个程序来读取数据并进行必要的更改,但不确定您是否熟悉编程...有几种语言可以用来实现这一点,我已经在 C 中做过类似的事情。它不是很难。 您可以打开文件、读取数据、处理更改并保存在另一个 .csv 中。请记住,csv 文件只是一个用逗号分隔的 .txt 文件。

    int main(int argc, char** argv) {
    
    FILE *file;
    
    FILE *file2;
    
    char Linha[100];
    char *result;
    int i;
    
    
    file = fopen("YourSheet.csv", "rt");
    file2 = fopen("YourNewSheet.csv", "w");
    
    i = 1;
    while (!feof(file))
    
    
    {
    // reads a line
      result = fgets(Linha, 100, file); 
      if (result)
      fprintf(file2, "%s", result);
      i++;
    
    
    }
    
    
    
    
    fclose(file);
      fclose(file2);
    
        return 0;
    }
    

    【讨论】:

      【解决方案4】:

      原来可以这么简单,我们也可以使用google查询SQL功能:

      Excel表格:

           A       B
      1    Qty   | 200
      2    Stock | QUESS
      3    Start | 8/24/2019
      4    End   | 8/23/2020
      5    Today | 8/23/2021
      

      公式:

      =query(Transpose(Sheet6!A1:B5),"select *" )
      

      输出:

      Qty | Stock | Start     | End       | Today
      200 | QUESS | 8/24/2019 | 8/23/2020 | 8/23/2021
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-03
        • 2021-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-14
        相关资源
        最近更新 更多