AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 78286358
Accepted
Michal Rosa
Michal Rosa
Asked: 2024-04-07 09:22:43 +0800 CST2024-04-07 09:22:43 +0800 CST 2024-04-07 09:22:43 +0800 CST

使用单个公式进行高级逆透视[重复]

  • 772
这个问题在这里已经有了答案:
将条目展平为 Excel 中两列对应的列表映射 (3 个答案)
将不规则的行转置为列并向下移动一行 (4 个答案)
在 Excel 中合并多列,同时保持引用单元格相同 (1 个答案)
如何开始将工作表转换为列表? (2 个回答)
如何根据单元格条件将列变成行? (1 个回答)
21 小时前关闭。

最近有人问我是否可以在不使用 PowerQuery、VBA 或 TypeScript 等任何更“高级”功能的情况下在 Excel 中取消数据透视表。

excel
  • 3 3 个回答
  • 94 Views

3 个回答

  • Voted
  1. Best Answer
    DjC
    2024-04-07T12:40:20+08:002024-04-07T12:40:20+08:00

    该TEXTSPLIT(TEXTJOIN())方法适用于较小的表,其中生成的字符串不会超过 32,767 个字符。

    对于任何大小的表,另一种方法是使用HSTACK基于TOCOL数组操作技术,该技术将根据表的复杂性而变化。

    示例 1:要保留的单行标签字段

    =LET(
        tbl, Table3[#All],
        vals, DROP(tbl, 1, 1),
        rowLabels, DROP(TAKE(tbl,, 1), 1),
        colLabels, DROP(TAKE(tbl, 1),, 1),
        HSTACK(
            TOCOL(IF(SEQUENCE(, COLUMNS(vals)), rowLabels)),
            TOCOL(IF(SEQUENCE(ROWS(vals)), colLabels)),
            TOCOL(vals)
        )
    )
    

    示例1.png

    示例 2:要保留的多个行标签字段

    =LET(
        tbl, Table3[#All],
        vals, DROP(tbl, 1, 2),
        rowLabels, DROP(TAKE(tbl,, 2), 1),
        colLabels, DROP(TAKE(tbl, 1),, 2),
        rowId, SEQUENCE(ROWS(vals)),
        HSTACK(
            CHOOSEROWS(rowLabels, TOCOL(IF(SEQUENCE(, COLUMNS(vals)), rowId))),
            TOCOL(IF(rowId, colLabels)),
            TOCOL(vals)
        )
    )
    

    示例2.png

    示例 3:要逆透视的多个值字段

    =LET(
        tbl, Table3[#All],
        vals, DROP(tbl, 1, 1),
        rowLabels, DROP(TAKE(tbl,, 1), 1),
        colLabels, UNIQUE(LEFT(DROP(TAKE(tbl, 1),, 1), 4), TRUE),
        HSTACK(
            TOCOL(IF(SEQUENCE(, COLUMNS(vals)/2), rowLabels)),
            TOCOL(IF(SEQUENCE(ROWS(vals)), colLabels)),
            WRAPROWS(TOCOL(vals), 2)
        )
    )
    

    示例3.png

    这些只是 3 个基本示例。不过,可以进行修改来处理几乎任何情况。

    • 2
  2. Michal Rosa
    2024-04-07T09:22:43+08:002024-04-07T09:22:43+08:00

    过去,我曾使用一些相当复杂的INDEX/MATCH解决方案来完成此任务,但令我惊讶的是(近年来我并没有真正经常使用 Excel)Excel 365 使这变得非常容易。

    一般解决方案非常简单且可读(特别是在使用命名表和范围时)。例如,对于一个基本表,例如:

    在此输入图像描述

    该公式实际上非常简单且易于遵循:

     =TEXTSPLIT(
          TEXTJOIN(",",TRUE,
               TOCOL(Table3[Company]&"|"&Table3[[#Headers],
               [2020]:[2023]]&"|"&Table3[[2020]:[2023]])),
               "|",",")
    

    真正让我印象深刻的是这个新LET功能对我来说是多么有用。例如,当对具有稍有不同的输入(带空格)和稍有不同的所需输出的表进行逆透视时,使用LET使公式更容易遵循:

     =LET(
          array,
          TEXTSPLIT(TEXTJOIN(",",TRUE,TOCOL(Table2[COMPANY]&"|"&Table2[[Service 1]:[Service 5]])),"|",","),
          FILTER(array,CHOOSECOLS(array,2)<>""))
    

    在此输入图像描述

    我在网上没有找到很多此类不可旋转公式的示例,因此希望其他人也会发现它有用。

    • 0
  3. Mayukh Bhattacharya
    2024-04-07T12:45:54+08:002024-04-07T12:45:54+08:00

    以下是使用动态 Excel 公式进行逆透视的一种方法,适用于MS365


    •方法1概述的方法是动态的,它随着行和列扩展的变化而爆炸:

    在此输入图像描述


    • 单元格中使用的公式A23

    =LET(
         _Data, Table3[#All],
         _Companies, TAKE(_Data,-(ROWS(_Data)-1),1),
         _Years, TAKE(_Data,1,-(COLUMNS(_Data)-1)),
         _Values, DROP(_Data,1,1),
         _Answer, HSTACK(
                TOCOL(IFS(_Values>0,_Companies),2),
                TOCOL(IFS(_Values>0,_Years),2),
                TOCOL(_Values,3)),
         VSTACK({"COMPANY","YEAR","VALUE"},_Answer))
    

    注意:使用相同的算法可以简单地使上面的公式变得更短,但它不会是动态的,即添加行时它会扩展,但增加列时不会扩展,可以尝试,上面的公式将立即扩展或折叠,如果实际来源发生变化。另一种方法,概述如下


    •方法2:

    =HSTACK(TOCOL(IFS(Table3[[2020]:[2023]]>0,Table3[COMPANY]),2),
            TOCOL(IFS(Table3[[2020]:[2023]]>0,Table3[[#Headers],[2020]:[2023]]),2),
            TOCOL(Table3[[2020]:[2023]],3))
    

    变体选项 1:另一种方法是使用自定义来编写第一个方法LAMBDA()来为每个方法运行,其中TOCOL()&IFS()不重复使用,这是动态的:

    =LET(
         _Data, Table3[#All],
         _Companies, TAKE(_Data,-(ROWS(_Data)-1),1),
         _Years, TAKE(_Data,1,-(COLUMNS(_Data)-1)),
         _Values, DROP(_Data,1,1),
         _CustomFx, LAMBDA(α,δ, TOCOL(IFS(α>0,δ),3)),
         _Answer, HSTACK(
                _CustomFx(_Values,_Years),
                _CustomFx(_Values,_Companies),
                _CustomFx(_Values,_Values)),
         VSTACK({"COMPANY","YEAR","VALUE"},_Answer))
    

    变体选项 2:如果您想应用与第二种方法相同的算法,也可以尝试这种方式,这不是动态的:

    =LET(
         _Data, Table3[#All],
         _Companies, Table3[COMPANY],
         _Years, Table3[[#Headers],[2020]:[2023]],
         _Values, Table3[[2020]:[2023]],
         _CustomFx, LAMBDA(α,δ, TOCOL(IFS(α>0,δ),3)),
         _Answer, HSTACK(
                _CustomFx(_Values,_Years),
                _CustomFx(_Values,_Companies),
                _CustomFx(_Values,_Values)),
         VSTACK({"COMPANY","YEAR","VALUE"},_Answer))
    

    对于第二个示例数据集,您可以尝试以下方式:

    在此输入图像描述


    =LET(
         _Data, Table2[#All],
         _Companies, TAKE(_Data,-(ROWS(_Data)-1),1),
         _Values, DROP(_Data,1,1),
         _Answer, HSTACK(
                TOCOL(IFS(_Values>0,_Companies),2),
                TOCOL(_Values,3)),
         VSTACK({"COMPANY","SERVICE"},_Answer))
    

    NOTE: Using TEXTJOIN() function when unpivoting data, I don't think is a rock-solid method, because the said function itself has some limitations, yes one can say every functions has their limitations, but all depends on the data one has. Still, I won't be using TEXTJOIN() function or ARRAYTOTEXT() or CONCAT() as per MSFT documentations --> If the resulting string exceeds 32767 characters (cell limit), TEXTJOIN() returns the #VALUE! error, clearly, it is bit risky to use. See the cell limit mentioned here, works with the whole array concept as it is taken into one, it will certainly return an error, as the array formula seats in one cell and 溢出到多行/列。


    • 0

相关问题

  • 如何返回列出的合同上有费率但系统中没有费率的特定行?

  • 当某些值重复时自动在表中添加参考字段?

  • 循环遍历具有更改单元格地址的列

  • 搜索字符串并输出与该字符串对应的值

  • Excel中有没有一种方法可以计算字符串中特定文本的出现次数,但也包括前一个字符?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行?

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    何时应使用 std::inplace_vector 而不是 std::vector?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Martin Hope
    Aleksandr Dubinsky 为什么 InetAddress 上的 switch 模式匹配会失败,并出现“未涵盖所有可能的输入值”? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge 为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini 具有指定基础类型但没有枚举器的“枚举类”的用途是什么? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer 何时应使用 std::inplace_vector 而不是 std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB 为什么 GCC 生成有条件执行 SIMD 实现的代码? 2024-02-17 06:17:14 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve