2012-08-09 47 views
113

这似乎是一个简单的数据透视表来学习。我想为我正在分组的特定值计算唯一值。简单的数据透视表来计算唯一值

举例来说,我有这样的:

ABC 123 
ABC 123 
ABC 123 
DEF 456 
DEF 567 
DEF 456 
DEF 456 

我要的是一个数据透视表,显示我:

ABC 1 
DEF 2 

,我只创建一个简单的数据透视表给我这个(一多少行)数:

ABC 3 
DEF 4 

但我想唯一值的数量来代替。

我真正想要做的是找出第一列中的哪些值在所有行的第二列中没有相同的值。换句话说,“ABC”是“好”,“DEF”是“坏”

我敢肯定有一个更简单的方法来做到这一点,但认为我会给数据透视表一个尝试...

+7

注意,对于最近版本的Excel中,[这个答案](http://stackoverflow.com/a/21552440/983722)最方便。 – 2014-11-21 15:41:57

回答

92

插入第三列和细胞C2粘贴此式

=IF(SUMPRODUCT(($A$2:$A2=A2)*($B$2:$B2=B2))>1,0,1) 

并复制它。现在基于第1列和第3列创建您的数据透视表。见快照

enter image description here

+0

+1我认为这比我的解决方案稍微简单一点,因为它不需要第一行的特殊值 – 2012-08-09 03:23:26

+2

Nice技巧。我不知道这个。你可以用一个数组函数'= IF(SUM((A $ 2:A2 = A2)*(B $ 2:B2 = B2))> 1,0,1)来做同样的事情'(当按下Ctrl-Shift-Enter时输入公式以便它获取周围的“{}”)。 – ErikE 2013-02-10 08:07:42

+0

通用答案,不需要任何特定功能。只是很好的普通公式。 – 2015-05-11 11:49:18

0

可以进行额外的列来存储的独特性,再总结在你的数据透视表。

我的意思是,单元格C1应始终为1。单元格C2应包含公式=IF(COUNTIF($A$1:$A1,$A2)*COUNTIF($B$1:$B1,$B2)>0,0,1)。复制此公式,以便单元格C3将包含=IF(COUNTIF($A$1:$A2,$A3)*COUNTIF($B$1:$B2,$B3)>0,0,1)等等。

如果您有一个标题单元格,您需要将这些全部向下移动,并且您的C3公式应为=IF(COUNTIF($A$2:$A2,$A3)*COUNTIF($B$2:$B2,$B3)>0,0,1)

-2

我发现这样做的一个简单的方法。参照Siddarth溃败的例子,如果我希望计算在A列的唯一值:

  • 添加新的列C和与式填充C2 “= 1/COUNTIF($ A:$ A,A2)”
  • 拖动公式向下到列
  • 枢列A为行标签的其余部分,总结{C列)中的值来获得唯一值的数列A
+0

从逻辑上讲,这不可能用于OP,因为它没有看'B'列。你将如何适应这个多列工作? – ErikE 2013-02-10 08:11:14

1

亚洲时报Siddharth的回答是了不起的。

但是,这项技术在处理大量数据时可能会遇到麻烦(我的电脑冻结了50,000行)。一些不太处理器密集的方法:

单唯一性检查

  1. 排序由两列(A,B在该示例中)
  2. 使用一个公式,着眼于以下数据

    =IF(SUMPRODUCT(($A2:$A3=A2)*($B2:$B3=B2))>1,0,1) 
    

多重唯一性检查

如果您需要检查不同列中的唯一性,则不能依赖两种类型。

相反,

  1. 排序单塔(A)
  2. 添加式覆盖的每个分组记录的最大数目。如果ABC可能有50行,该公式将是

    =IF(SUMPRODUCT(($A2:$A49=A2)*($B2:$B49=B2))>1,0,1) 
    
+2

另一种可能更少的处理器密集型方式是添加一列C和C2'= A2&B2'。然后添加一个列D,并在D2中放入'= IF(MATCH(C2,C $ 2:C2,0)= ROW(C1),1,0)'。填补双方。虽然这仍然是从整个范围开始搜索,但它会在找到第一个时停止搜索,而不是将50,000行的值相乘在一起,只需要定位值 - 因此它应该表现得更好。 – ErikE 2013-02-10 08:14:58

+0

@ErikE Sharp - 我也认为你的技术在第一次发现时停下来。但是如果你在C中有很多独特的值(例如:只有50个ABC),你将继续检查大量的数据。很酷的功能:当数据未排序时,您的公式效果最佳。 – workglide 2013-02-10 12:54:01

0

如果你有数据整理..我建议用以下公式

=IF(OR(A2<>A3,B2<>B3),1,0) 

这是更快它使用较少的细胞计算。

8

我想抛出一个附加选项成没有按”混合t需要一个公式,但如果您需要对两个不同列中的集合中的唯一值进行计数,可能会有所帮助。使用原来的例子,我没有:

ABC 123 
ABC 123 
ABC 123 
DEF 456 
DEF 567 
DEF 456 
DEF 456 

,并希望它显示为:

ABC 1 
DEF 2 

但更多的东西一样:

ABC 123 
ABC 123 
ABC 123 
ABC 456 
DEF 123 
DEF 456 
DEF 567 
DEF 456 
DEF 456 

,并希望它出现:

ABC 
    123 3 
    456 1 
DEF 
    123 1 
    456 3 
    567 1 

我发现了最好的方式获得我的数据到这个格式,然后可以进一步对其进行操作是使用以下命令:

enter image description here

一旦您选择了这种情况,那么选择辅助数据集的标题(“在运行总计”它将是包含123,456和567的数据集的标题或列标题)。这将为您提供主数据集内该项目中项目总数的最大值。

然后,我复制这些数据,将其粘贴为值,然后将其放在另一个数据透视表中以更容易地操作它。我有大约25万行的数据,所以这比一些公式方法效果好得多,尤其是那些试图在两列/数据集之间进行比较的公式,因为它会使应用程序崩溃。

+0

我有一个完全不同的问题,但这个答案只是指出我在正确的方向。谢谢。 – jtolle 2013-12-12 22:40:27

+0

这个答案符合我的需要,因为我有500,000行,我需要应用公式和我的电脑用尽内存,如果我想。谢谢! – cauldyclark 2016-03-21 00:00:57

3

对于以下公式,无需对表格进行排序,以针对每个存在的唯一值返回1。

假设在问题提出的数据表的范围为A1:

=IF(COUNTIF($B$1:$B1,B1)>1,0,COUNTIF($B$1:$B1,B1)) 

复制该式对所有的行和最后一行将包含:B7在细胞C1输入以下公式

=IF(COUNTIF($B$1:$B7,B7)>1,0,COUNTIF($B$1:$B7,B7)) 

这会导致第一次找到记录时返回1,之后所有时间将返回0。

简单的总结列在您的数据透视表

+2

如果你有一个大的数据集,使用'= IF(COUNTIF($ B $ 1:$ B1,B1),1,0)' - 这样,countif只运行一次! – 2013-10-01 21:11:55

211

更新:您现在可以自动使用Excel 2013年做到这一点,我创造了这个作为一个新的答案,因为我以前的答案实际上解决了一个稍微不同的问题。

如果你有这个版本,然后选择你的数据来创建一个数据透视表,并且当你创建你的表时,确保选项'添加这个数据到数据模型'复选框是检查(见下文)。

Tick the box next to 'Add this data to the Data Model'

然后,你的数据透视表打开时,创建您的行,列和值正常。然后点击您想要计算不同计数的字段并编辑字段值设置: Edit field value settings

最后,向下滚动到最后一个选项并选择“Distinct Count”。' Choose the option 'Distinct Count'

这应该更新您的数据透视表值以显示您正在查找的数据。

+21

这是比接受的更好的答案。 – 2014-03-14 16:44:58

+1

有没有人知道这是否也适用于LibreOffice?似乎没有类似的选择,但它可能隐藏在某个地方? – Stockfisch 2014-05-05 14:59:45

+0

这帮了我很多。谢谢。任何人都知道,如果我在Excel 2010中打开一个带有不同计数汇总的Excel文件,会发生什么情况?数据透视表可能会搞砸了吗? – Sawd 2015-07-27 19:35:49

0

我通常按字段排序数据,我需要做不同的计数,然后使用IF(A2 = A1,0,1);你会得到每个ID组的第一行中的1。简单并且不需要任何时间在大型数据集上进行计算。

1

Excel 2013可以做计数不同的枢轴。如果没有2013访问权限,并且数据量较少,我会创建两份原始数据,并在副本b中选择两列并删除重复项。然后制作数据透视表并计算您的列数b。

2

我对这个问题的解决方法与我在这里看到的有点不同,所以我会分享。

  1. (让你的数据的副本第一)
  2. 串联列
  3. 对所连接的列
  4. 最后删除重复 - 在出现的设置支点

注:我想包括图像,使这更容易理解,但不能因为这是我的第一篇文章;)

1

您可以将COUNTIFS用于多个条件,

= 1/COUNTIFS(A:A,A2,B:B,B2)然后向下拖动。您可以在其中放置尽可能多的标准,但这往往需要大量时间来处理。

1

步骤1.在第一记录添加列

步骤2.使用公式= IF(COUNTIF(C2:$C$2410,C2)>1,0,1)

步骤3.拖动它来的所有记录

步骤4.通过公式过滤“1”列中的公式

3

我发现最简单的方法是使用Value Field Settings下的Distinct Count选项(单击Values窗格中的字段)。 Distinct Count的选项位于列表的最底部。

Location of where to click

这里是前(TOP;正常Count)后(BOTTOM; Distinct Count

COUNT

DISTINCT COUNT

相关问题