一意の値をカウントする単純なピボットテーブル


134

これは、学習するための単純なピボットテーブルのようです。グループ化している特定の値に対して一意の値のカウントを行いたいのですが。

たとえば、私はこれを持っています:

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

私が欲しいのはこれを示すピボットテーブルです:

ABC   1
DEF   2

私が作成する単純なピボットテーブルは、これ(行数のカウント)を提供します。

ABC   3
DEF   4  

ただし、代わりに一意の値の数が必要です。

私が本当にしようとしていることは、すべての行について、最初の列のどの値が2番目の列の同じ値を持っていないかを調べることです。つまり、「ABC」は「良い」、「DEF」は「悪い」

もっと簡単な方法があると確信していますが、ピボットテーブルを試してみると思います...


8
Excelの最近のバージョンでは、この回答が最も便利です。
Dennis Jaheruddin 2014年

回答:


108

3番目の列を挿入し、セルにC2この数式を貼り付けます

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

それを下にコピーします。次に、第1列と第3列に基づいてピボットを作成します。スナップショットを見る

ここに画像の説明を入力してください


+1最初の行に特別な値を必要としないため、これは私のソリューションよりも少し簡単だと思います
lc。

2
素晴らしいテクニック。これについては知りませんでした。配列関数でも同じことができます=IF(SUM((A$2:A2=A2)*(B$2:B2=B2)) > 1, 0, 1)(数式を入力するときにCtrl-Shift-Enterを押して、数式の{}周りに取得します)。
ErikE 2013

特定の機能を必要としない普遍的な答え。ちょうど良いプレーンな式。
Alberto De Caro

これを3列の状況に拡張する方法に関するアイデアはありますか?
tumultous_rooster 2015

13
ピボットテーブルオプションを使用して一部の行を除外すると、この回答では正しい解決策が得られないことに注意してください。最初の行が除外されたとしましょう。ABCの合計は0のように見えます。
jarlemag

250

更新:Excel 2013でこれを自動的に実行できるようになりました。以前の回答で実際には少し異なる問題が解決されたため、これを新しい回答として作成しました。

そのバージョンがある場合は、データを選択してピボットテーブルを作成し、テーブルを作成するときに、[このデータをデータモデルに追加する]チェックボックスがオンになっていることを確認します(以下を参照)。

「このデータをデータモデルに追加する」の横のボックスにチェックを入れます

次に、ピボットテーブルが開いたら、行、列、値を通常どおり作成します。次に、個別のカウントを計算するフィールドをクリックして、フィールド値の設定を編集します。 フィールド値の設定を編集する

最後に、最後のオプションまで下にスクロールして、[Distinct Count]を選択します。 「Distinct Count」オプションを選択します

これにより、ピボットテーブルの値が更新され、探しているデータが表示されます。


5
@MichaelKは、Excel 2013をお持ちの方がはるかに優れています
jrharshath、2015

3
これは既存のピボットテーブルに対しても実行できるため、個別カウント機能にアクセスするために200以上のテーブルを再作成する必要はありませんか?
Louisa

12
参考までに:ファイルをまだExcel(.xlsx)ファイルとして保存していない場合(例:.csvファイルを開いた場合)、[このデータをデータモデルに追加する]オプションは無効化/グレー表示されます。簡単な解決策は、ファイルをExcelファイルとして保存することです。
PonyEars 2016年

9
これはMacではサポートされていませんか?このオプションは私には表示されません。バージョン15.27を使用しています。
jkupczak 2017年

4
データモデルは一般にWindows専用の機能であるため、このオプションは実際にはMacには存在しません。
Tomty

10

数式を必要としない追加のオプションをミックスに追加しますが、2つの異なる列にまたがるセット内の一意の値をカウントする必要がある場合に役立ちます。元の例を使用すると、私は持っていませんでした:

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

データをこの形式にして、さらに操作できるようにするための最良の方法は、次の方法を使用することでした。

ここに画像の説明を入力してください

[積算合計]を選択したら、セカンダリデータセットのヘッダーを選択します(この場合は、123、456、567を含むデータセットのヘッダーまたは列タイトルになります)。これにより、プライマリデータセット内の、そのセット内のアイテムの総数を含む最大値が得られます。

次に、このデータをコピーして値として貼り付け、別のピボットテーブルに配置して、より簡単に操作できるようにしました。

ちなみに、私は約25万行のデータを持っていたので、これはいくつかの数式アプローチ、特にアプリケーションをクラッシュさせ続けたために2つの列/データセットを比較しようとするものよりもはるかにうまく機能しました。


私はまったく別の問題を抱えていましたが、この答えは私を正しい方向に向かわせました。ありがとう。
jtolle

数式を適用する必要がある行が500,000あり、使用しようとするとコンピューターがメモリ不足になるため、この答えは私のニーズに合います。ありがとうございました!
コーディクラーク2016年

6

最も簡単な方法は、Distinct Count下のオプションを使用することですValue Field Settings(ペインのフィールドをクリックしますValues)。のオプションDistinct Countはリストの一番下にあります。

クリックする場所の場所

これは、前(TOP;通常Count)と後(BOTTOM; Distinct Count)です。

カウント

個別のカウント


3
Office 2016以降:この機能を使用できるようにするには、[このデータをデータモデルに追加する]チェックボックスをオンにしてピボットテーブルを作成する必要があります。
レオ


3

次の式が存在する一意の値ごとに1を返すようにテーブルをソートする必要はありません。

質問で提示されたデータのテーブル範囲がA1:B7であるとすると、セルC1に次の数式を入力します。

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

その数式をすべての行にコピーすると、最後の行に次のものが含まれます。

=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は1回だけ実行されます。
ピーターアルバート

2

この問題への私のアプローチは、ここで見るものとは少し異なっていたので、共有します。

  1. (最初にデータのコピーを作成してください)
  2. 列を連結する
  3. 連結された列の重複を削除する
  4. 最後-結果セットのピボット

注:これをさらに理解しやすくするために画像を含めたいのですが、これは私の最初の投稿なので、できません;)


1

Siddharthの答えは素晴らしいです。

ただし、この手法は、大量のデータを処理するときに問題が発生する可能性があります(私のコンピューターは50,000行でフリーズしました)。プロセッサをあまり使用しない方法:

単一性チェック

  1. 2つの列(この例ではA、B)で並べ替え
  2. より少ないデータを参照する数式を使用する

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

複数の一意性チェック

異なる列の一意性をチェックする必要がある場合、2つのソートに依存することはできません。

代わりに、

  1. 単一の列を並べ替える(A)
  2. 各グループの最大レコード数をカバーする数式を追加します。ABCに50行ある場合、式は次のようになります。

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

2
おそらくプロセッサーをあまり使わないもう1つの方法は、列CとC2を追加すること=A2&B2です。次に、列Dを追加し、D2にputし=IF(MATCH(C2, C$2:C2, 0) = ROW(C1), 1, 0)ます。両方を埋めてください。これでも範囲全体の先頭から検索しますが、最初の範囲が見つかると停止します。50,000行の値を掛け合わせる代わりに、値を特定するだけでよいので、パフォーマンスが大幅に向上します。
ErikE 2013

@ErikE Sharp-あなたのテクニックは最初の発見で止まると思います。ただし、Cに多数の一意の値がある場合(例:ABCは50のみ)、大量のデータを引き続きチェックします。クールな機能:データが並べ替えられていないときに数式が最適に機能します。
workglide 2013

1

Excel 2013では、ピボットで個別のカウントを実行できます。2013にアクセスできず、データ量が少ない場合は、生データのコピーを2つ作成し、コピーbで両方の列を選択して重複を削除します。次にピボットを作成し、列をカウントしますb。


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」をフィルタリングする


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)ようにします。

ヘッダーセルがある場合、これらをすべて1行下に移動すると、C3数式はになります=IF(COUNTIF($A$2:$A2,$A3)*COUNTIF($B$2:$B2,$B3)>0,0,1)


0

データを並べ替えている場合は、次の式を使用することをお勧めします

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

計算に使用するセルが少ないため、これはより高速です。


0

私は通常、個別のカウントを行う必要があるフィールドでデータをソートしてから、IF(A2 = A1,0,1)を使用します。次に、IDの各グループの最上行に1が表示されます。シンプルで、大規模なデータセットの計算に時間がかかりません。


0

ヘルパーカラムにも使用できますVLOOKUP。私はテストし、少し速く見えますCOUNTIFます。

ヘッダーを使用していて、データがcell A2で始まっている場合、行の任意のセルでこの数式を使用して、同じ列の他のすべてのセルにコピーします。

=IFERROR(IF(VLOOKUP(A2;$A$1:A1;1;0)=A2;0;1);1)

-3

私はこれを行う簡単な方法を見つけました。Siddarth Routの例を参照して、列Aの一意の値をカウントする場合:

  • 新しい列Cを追加し、C2に式 "= 1 / COUNTIF($ A:$ A、A2)"を入力します
  • 数式を列の残りの部分まで下にドラッグします
  • 列Aを行ラベルとしてピボットし、値にSum {column C)を入れて列Aの一意の値の数を取得します

論理的には、OPでcolumnを参照しないため、これはおそらく機能しませんB。これを複数の列で動作するようにどのように適合させますか?
ErikE 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.