代码之家  ›  专栏  ›  技术社区  ›  Clark Hung

如果主类别相同,如何统计所有子类别,但只统计一次

  •  0
  • Clark Hung  · 技术社区  · 2 年前
    公司 品牌 CHI制造 台湾制造 美国制造
    AA 苹果 6. 0 1.
    BB BoyO 0 1. 0
    BB BoyX 1. 0 0
    科科斯群岛 汽车 17 1. 0
    DD DogO 4. 0 1.
    DD DogX 1. 0 1.
    EE Elva 8. 1. 0

    问题1

    我想看看有多少公司有CHI或Made in USA的产品(有些公司有两个或多个品牌,但我只想统计1次,比如DogO和DogX,这两个品牌都有CHI和USA的产品,但它们属于同一家公司,所以我只统计1次)

    结果应该是5(分别是AA、BB、CC、DD、EE公司)


    问题2

    我还想检查有多少家公司的产品在美国制造(DogO和DogX也有美国制造的产品,但它们来自同一家公司,所以我只想统计1家)

    结果应该是2(分别是AA和DD公司)

    1 回复  |  直到 2 年前
        1
  •  0
  •   Mayukh Bhattacharya    2 年前

    您可以尝试以下公式:

    对于问题一:

    enter image description here


    =SUM(N(MAP(A2:A8,LAMBDA(x, COUNTIF(A2:x,x)))=1))
    

    • 使用 MAP() 函数迭代中的每个单元格 Company 列以获取运行计数。
    • 以上返回运行计数,因此等于 1 它赋予了独特的品牌,但没有考虑到 Made in 类别,但如果数据如OP中所示是一致的,那么这应该有效。
    • 以上返回 TRUE FALSE --> 符合事实的 是那些唯一的值,为了得到计数,我们只是将它们相加。
    • 或者,如果要考虑列标题以使其动态,则需要使用以下公式:

    =SUM(N(FILTER(A2:A8,MMULT( (1-ISNA(XMATCH(C1:E1,{"Made in CHI","Made in USA"})))* (MAP(A2:A8,LAMBDA(x,
       COUNTIF(A2:x,x)))=1),{1;1;1}))<>""))
    

    或者短一点的替代方案,可能是:

    =ROWS(UNIQUE(TOCOL(IFS(FILTER(C2:E8,1-ISNA(XMATCH(C1:E1,{"Made in CHI","Made in USA"})))>0,A2:A8),2)))
    

    =ROWS(UNIQUE(TOCOL(IFS(1-ISNA(XMATCH(C1:E1,{"Made in CHI","Made in USA"})),A2:A8),2)))
    

    对于问题二:

    =SUM(N(UNIQUE(FILTER(A2:A8,MMULT((1-ISNA(XMATCH(C1:E1,"Made in USA")))*(C2:E8>0),{1;1;1})))<>""))
    

    • 使用 XMATCH() 获取匹配的头列,并验证相应列的值是否大于 0
    • 包装在 MMULT() 以在两个阵列的矩阵乘积之后返回输出。
    • 使用 FILTER() 函数只抓取那些大于 0
    • 使用 UNIQUE() 用于排除重复项的函数
    • 最后,使用 SUM() 我们也可以使用 ROWS() 函数或 COUNTA() 但避免使用,因为所述函数可能会返回 FALSE POSITIVES 使用时 SUM() 它不会也会返回所需的确切输出。