【问题标题】:Count unique values in a filtered table without volatility在没有波动的过滤表中计算唯一值
【发布时间】:2017-09-21 08:53:20
【问题描述】:

我需要计算过滤表的列中的唯一值。

公式必须仅在一个单元格中(不添加带有标志的列),并且必须是非易失性(例如,没有偏移)

到目前为止,我有这个野兽:

=IF(COUNTA(A1:A3043) = SUBTOTAL(3, A1:A3043), SUMPRODUCT(1 * (A1:A3043 <> A2:A3044)),SUM(IF(FREQUENCY(IF(SUBTOTAL(3,OFFSET(A1,ROW(A1:A3043)-ROW(A1),0,1)),MATCH(A1:A3043,A1:A3043,0)),ROW(A1:A3043)-ROW(A1)+1)>0,1)))

但是由于它的波动性,过滤大型表时非常慢。

明确地说,如果我在下表中过滤“已购买的商品”,仅包含值 a,那么我的唯一客户数将为 4(customerIDs 1、4、5、 6):

提前致谢。

【问题讨论】:

    标签: excel unique formula


    【解决方案1】:

    要获取对应 Item Purchased 的唯一 Customer 的计数,请使用以下公式

    =SUM(IF("a"=$B$2:$B$12, 1/(COUNTIFS($B$2:$B$12, "a", $A$2:$A$12, $A$2:$A$16)), 0))
    

    =SUM(--(FREQUENCY(IF($B$2:$B$12="a",MATCH($A$2:$A$12,$A$2:$A$12,0)),ROW($A$2:$A$12)-ROW(A2)+1)>0))
    

    其中,A2:B12 是数据范围,并将 a 替换为购买的任何商品。这是一个数组公式,所以按 Ctrl+Shift+Enter 提交它。


    要获取所有购买商品的唯一客户数,请在Cell D2 中输入以下公式

    =IFERROR(INDEX($B$2:$B$16,MATCH(0,INDEX(COUNTIF($D$1:D1,$B$2:$B$16),0,0),0)),"")
    

    根据需要向下拖动/复制。

    然后在Cell E2输入下面的数组公式

    =SUM(--(FREQUENCY(IF($B$2:$B$16=D2,MATCH($A$2:$A$16,$A$2:$A$16,0)),ROW($A$2:$A$16)-ROW(A2)+1)>0))
    

    =SUM(IF(D2=$B$2:$B$16, 1/(COUNTIFS($B$2:$B$16, D2, $A$2:$A$16, $A$2:$A$16)), 0))
    

    根据需要向下拖动/复制。作为一个数组公式,按 Ctrl+Shift+Enter 提交它。参考图片。

    【讨论】:

      【解决方案2】:

      要计算过滤列中的唯一值,请使用此公式

      =SUM(IF(FREQUENCY(IF(SUBTOTAL(3,OFFSET(A2,ROW(A2:A35)-ROW(A2),,1)),IF(A2:A35<>"",MATCH("~"&A2:A35,A2:A35&"",0))),ROW(A2:A35)-ROW(A2)+1),1))
      

      如果您的数据在列A:B 中,请在单元格D1 中输入此公式。输入时应按 CTRL+SHIFT+ENTER,因为这是数组公式。

      如果没有 volatile Offset 公式,我认为你无法实现这一点,但这个公式可能会快一点。

      【讨论】:

      • 我不认为这很有效。在 OP 的未过滤列表上,它应该返回 12 时返回 6。这是由于公式仅将客户视为唯一而不是客户 + 项目
      • 您的陈述是正确的,但同样,他没有提到任何需要唯一的客户+项目。他说他只需要计算唯一客户。
      • 很公平。我正在阅读整行的“独特价值”,但现在在最后一段中看到 OP 确实说独特的客户。
      • 可以用 INDEX 代替 OFFSET 吗?
      • 嗯,不确定,因为它是用来创建数组的。您是否考虑过在输入数据/使用工作表范围时将计算设置为手动。这样你的表现就不会受到易变公式的影响?然后在完成所有工作后,将计算设置回自动...
      【解决方案3】:

      你可以试试

      =SUMPRODUCT((($A$2:$A$12<>"")*SUBTOTAL(3,OFFSET($A$2,ROW($A$2:$A$12)-MIN(ROW($A$2:$A$12)),0)))/COUNTIFS(A2:A12,A2:A12,B2:B12,B2:B12))
      

      这将计算过滤列表中的所有唯一值。您遇到的问题是您需要 OFFSET 才能看到行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-05
        • 1970-01-01
        • 2020-08-08
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多