在Excel

时间:2016-06-07 09:49:09

标签: excel excel-formula pivot-table

我遇到了从表中获取报告的问题,看起来像这样:

C1| C2         | C3 | C4
A | 2015-05-15 | 34 | 4
A | 2015-03-12 | -4 | 5
A | 2014-03-12 | 24 | 8
B | 2015-11-10 | -4 | 5
B | 2015-06-12 | 3 | 5
C | 2013-05-12 | 3 | 5
...
600+ rows
...

所以我需要通过第一列中的值对不同的值列(C3和C4)进行分组。在通常的情况下,可以通过分离表来实现这样的表(例如对于col3):

A  |  B  |  C  | ....
34 |  -4 |  3  | ....
-4 |  3  |     | ....
24 |     |     | ....

对于col4,我需要一个具有相似布局的表。简而言之,我需要制作一些关键表,而不是每个术语的值聚合。是否有可能用原始表格获得这样的小桌子?如果您可以为原始数据提供一些其他布局,这些布局将更适合(并且更容易,对于此标准的excel函数更为理想),可以免费提供 - 使用一些Python脚本我可以重新保存它。

2 个答案:

答案 0 :(得分:0)

首先,我假设C1,C2,C3,C4是A1:D1中的列标题,数据是A2:D1000

  1. 在F1:H1地方C3,C3,C3
  2. 在F2:H2位置A,B,C
  3. 在J1:L1地点C4,C4,C4
  4. 在J2:L2地方A,B,C
  5. 在F3中放置以下数组公式:

    =IFERROR(INDEX(OFFSET($A$2:$A$1000,0,MATCH(F$1,$A$1:$D$1,0)-1),SMALL(IF($A$2:$A$1000=F$2,ROW($A$2:$A$1000)-ROW(A$2)+1),ROWS(F$2:F2))),"")
    

    不要忘记使用 Ctrl + Shift + 输入使其成为数组公式而不是仅使用输入作为正常公式。

  6. 将F3复制到F4:F7,G3:H7和J3:L7

  7. 你最终会看到这样的东西:

        | A             B     C     D    E    F    G    H    I    J    K    L
    ----|--------------------------------------------------------------------
    1   | C1           C2    C3    C4        C3   C3   C3        C4   C4   C4
    2   | A    15/05/2015    34     4        A     B    C         A    B    C
    3   | A    12/03/2015    -4     5        34   -4    3         4    5    5
    4   | A    12/03/2014    24     8        -4    3              5    5     
    5   | B    10/11/2015    -4     5        24                   8          
    6   | B    12/06/2015     3     5                                        
    7   | C    12/05/2013     3     5                                        
    

    在F3中分解公式:

    =IFERROR(INDEX(source column,SMALL(filtered row numbers,ranking)),"")
    

    其中:

    • 源列为OFFSET($A$2:$A$1000,0,MATCH(F$1,$A$1:$D$1,0)-1)
    • 过滤的行号为IF($A$2:$A$1000=F$2,row numbers)
    • 行号为ROW($A$2:$A$1000)-ROW(A$2)+1
    • 排名为ROWS(F$2:F2)

    公式如何运作是一个多部分的解释:

    • IFERROR(formula,"")如果嵌入式公式产生错误,那么我们会显示一个空单元格。这很有用,因为我们不知道会得到多少结果。
    • INDEX(range,row)获取我们想要查看的行中的值。此处的行号是根据数据是否符合条件动态生成的。
    • SMALL(array,k)提取数组中的第k个最小值。数组是过滤值。 k只是一个数字,取决于我们将公式放入F中的哪一行。
    • IF(criteria,value)根据标准生成值或FALSE。
    • ROW(cell)单元格的行号
    • ROWS(range)范围的大小

    所以在数组公式中:

    • ROW($A$2:$A$1000)-ROW(A$2)+1是从1
    • 开始的范围内所有行号的列表
    • IF($A$2:$A$1000=F$2,ROW($A$2:$A$1000)-ROW(A$2)+1)是仅列出符合条件
    • 的行号的列表
    • SMALL获取过滤后的列表并返回第k个最小的过滤行号,这意味着F3获得第一个,F4获得第二个,等等。
    • INDEX抓取该行号的数据并显示

    我从http://www.exceltactics.com/make-filtered-list-sub-arrays-excel-using-small/得到了这个想法,在那个页面上是一个非常好的解释,它是如何工作的。

答案 1 :(得分:0)

找到一个简单的解决方案:只需下载工具Tableau。它可以根据原始数据创建非常灵活的图形,可以自由地将任何列作为行,反之亦然,也可以进行摸索。