Tableau croisé dynamique simple pour compter les valeurs uniques

134

Cela ressemble à un simple tableau croisé dynamique pour apprendre. Je voudrais faire un décompte des valeurs uniques pour une valeur particulière sur laquelle je regroupe.

Par exemple, j'ai ceci:

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

Ce que je veux, c'est un tableau croisé dynamique qui me montre ceci:

ABC   1
DEF   2

Le tableau croisé dynamique simple que je crée me donne simplement ceci (un compte du nombre de lignes):

ABC   3
DEF   4  

Mais je veux plutôt le nombre de valeurs uniques.

Ce que j'essaie vraiment de faire, c'est de savoir quelles valeurs de la première colonne n'ont pas la même valeur dans la deuxième colonne pour toutes les lignes. En d'autres termes, "ABC" est "bon", "DEF" est "mauvais"

Je suis sûr qu'il existe un moyen plus simple de le faire, mais j'ai pensé que j'essaierais le tableau croisé dynamique ...

user1586422
la source
8
Notez que pour les versions récentes d'Excel, cette réponse est la plus pratique.
Dennis Jaheruddin

Réponses:

108

Insérez une 3e colonne et dans la cellule C2collez cette formule

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

et copiez-le. Créez maintenant votre pivot basé sur la 1ère et la 3ème colonne. Voir l'instantané

entrez la description de l'image ici

Déroute de Siddharth
la source
+1 Je pense que c'est légèrement plus facile que ma solution car elle ne nécessite pas de valeur spéciale pour la première ligne
lc.
2
Belle technique. Je ne savais pas pour celui-ci. Vous pouvez faire la même chose avec une fonction de tableau =IF(SUM((A$2:A2=A2)*(B$2:B2=B2)) > 1, 0, 1)(appuyez sur Ctrl-Maj-Entrée lors de la saisie de la formule afin qu'elle s'acquiert {}autour d'elle).
ErikE
Réponse universelle, ne nécessitant aucune fonctionnalité spécifique. Juste de bonnes formules simples.
Alberto De Caro
Une idée sur la façon d'étendre cela à une situation à trois colonnes?
tumultous_rooster
13
Notez que cette réponse ne donnera PAS la solution correcte si vous filtrez certaines des lignes à l'aide des options de tableau croisé dynamique. Disons que la première ligne est filtrée. La somme des ABC apparaîtra alors égale à 0!
jarlemag
250

MISE À JOUR: Vous pouvez le faire maintenant automatiquement avec Excel 2013. J'ai créé cela comme une nouvelle réponse car ma réponse précédente résout en fait un problème légèrement différent.

Si vous disposez de cette version, sélectionnez vos données pour créer un tableau croisé dynamique et, lorsque vous créez votre tableau, assurez-vous que la case à cocher "Ajouter ces données au modèle de données" est cochée (voir ci-dessous).

Cochez la case à côté de "Ajouter ces données au modèle de données"

Ensuite, lorsque votre tableau croisé dynamique s'ouvre, créez vos lignes, colonnes et valeurs normalement. Cliquez ensuite sur le champ dont vous souhaitez calculer le nombre distinct et modifiez les paramètres de valeur de champ: Modifier les paramètres de valeur de champ

Enfin, faites défiler jusqu'à la toute dernière option et choisissez «Distinct Count». Choisissez l'option 'Distinct Count'

Cela devrait mettre à jour les valeurs de votre tableau croisé dynamique pour afficher les données que vous recherchez.

Meaghan Fitzgerald
la source
5
@MichaelK c'est beaucoup mieux, si vous avez Excel 2013
jrharshath
3
Cela peut-il également être fait pour les tableaux croisés dynamiques existants, afin que nous n'ayons pas besoin de recréer plus de 200 tables pour accéder à la fonctionnalité de comptage distincte?
Louisa
12
Juste un FYI: si vous n'avez pas encore enregistré votre fichier en tant que fichier Excel (.xlsx) (par exemple: vous avez ouvert un fichier .csv), l'option "Ajouter ces données au modèle de données" est désactivée / grisée . La solution simple consiste à enregistrer le fichier sous forme de fichier Excel.
PonyEars
9
N'est-ce pas pris en charge sur Mac? Cette option ne m'apparaît pas. Je suis sur la version 15.27.
jkupczak
4
Cette option n'existe en effet pas sur un Mac, car les modèles de données en général sont une fonctionnalité uniquement Windows.
Tomty
10

J'aimerais ajouter une option supplémentaire au mélange qui ne nécessite pas de formule, mais qui pourrait être utile si vous devez compter des valeurs uniques dans l'ensemble sur deux colonnes différentes. En utilisant l'exemple d'origine, je n'avais pas:

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

et veulent qu'il apparaisse comme:

ABC   1  
DEF   2

Mais quelque chose de plus comme:

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

et voulait qu'il apparaisse comme:

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

J'ai trouvé le meilleur moyen d'obtenir mes données dans ce format, puis de pouvoir les manipuler davantage, c'était d'utiliser ce qui suit:

entrez la description de l'image ici

Une fois que vous sélectionnez «Total cumulé dans», choisissez l'en-tête de l'ensemble de données secondaire (dans ce cas, il s'agirait de l'en-tête ou du titre de colonne de l'ensemble de données qui comprend 123, 456 et 567). Cela vous donnera une valeur maximale avec le nombre total d'éléments dans cet ensemble, dans votre ensemble de données principal.

J'ai ensuite copié ces données, les ai collées en tant que valeurs, puis je les ai placées dans un autre tableau croisé dynamique pour les manipuler plus facilement.

Pour info, j'avais environ un quart de million de lignes de données, donc cela fonctionnait beaucoup mieux que certaines des approches de formule, en particulier celles qui essaient de comparer entre deux colonnes / ensembles de données car cela n'arrêtait pas de planter l'application.

Meaghan Fitzgerald
la source
J'avais un problème complètement différent, mais cette réponse m'a juste orienté dans la bonne direction. Merci.
jtolle
cette réponse correspond à mon besoin car j'ai 500 000 lignes dont j'ai besoin pour appliquer la formule et mon ordinateur manque de mémoire si j'essaie de le faire. Merci!
cauldyclark
6

J'ai trouvé que l'approche la plus simple consiste à utiliser l' Distinct Countoption ci-dessous Value Field Settings( clic gauche sur le champ dans le Valuesvolet). L'option pour se Distinct Counttrouve tout en bas de la liste.

Emplacement où cliquer

Voici l'avant (TOP; normal Count) et après (BOTTOM; Distinct Count)

COMPTER

NOMBRE DISTINCT

Peter
la source
3
Depuis Office 2016: pour pouvoir utiliser cette fonctionnalité, le tableau croisé dynamique doit être créé avec «Ajouter ces données au modèle de données» coché.
Leo
3

Il n'est pas nécessaire que la table soit triée pour que la formule suivante renvoie un 1 pour chaque valeur unique présente.

en supposant que la plage de tableau pour les données présentées dans la question est A1: B7 entrez la formule suivante dans la cellule C1:

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

Copiez cette formule sur toutes les lignes et la dernière ligne contiendra:

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

Il en résulte un 1 renvoyé la première fois qu'un enregistrement est trouvé et 0 pour toutes les fois par la suite.

Additionnez simplement la colonne dans votre tableau croisé dynamique

Jeff Baumet
la source
2
Dans le cas où vous avez un grand ensemble de données, utilisez =IF(COUNTIF($B$1:$B1,B1),1,0)- de cette façon, countif n'est exécuté qu'une seule fois!
Peter Albert
2

Mon approche de ce problème était un peu différente de ce que je vois ici, donc je vais partager.

  1. (Faites d'abord une copie de vos données)
  2. Concaténer les colonnes
  3. Supprimer les doublons sur la colonne concaténée
  4. Dernier - pivoter sur l'ensemble résultant

Remarque: j'aimerais inclure des images pour rendre cela encore plus facile à comprendre mais je ne peux pas car c'est mon premier message;)

Jacob Noone Wade
la source
1

La réponse de Siddharth est formidable.

Cependant , cette technique peut poser problème lorsque vous travaillez avec un grand ensemble de données (mon ordinateur s'est figé sur 50 000 lignes). Quelques méthodes moins gourmandes en ressources processeur:

Contrôle d'unicité unique

  1. Trier par les deux colonnes (A, B dans cet exemple)
  2. Utilisez une formule qui examine moins de données

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

Plusieurs contrôles d'unicité

Si vous devez vérifier l'unicité dans différentes colonnes, vous ne pouvez pas vous fier à deux types.

Au lieu,

  1. Trier une seule colonne (A)
  2. Ajoutez une formule couvrant le nombre maximum d'enregistrements pour chaque regroupement. Si ABC peut avoir 50 lignes, la formule sera

    =IF(SUMPRODUCT(($A2:$A49=A2)*($B2:$B49=B2))>1,0,1)
    
workglide
la source
2
Un autre moyen peut-être moins gourmand en processeur consiste à ajouter une colonne C et dans C2 =A2&B2. Ajoutez ensuite une colonne D et en D2 mettez =IF(MATCH(C2, C$2:C2, 0) = ROW(C1), 1, 0). Remplissez les deux. Bien que cela continue de rechercher depuis le début de la plage entière, il s'arrête lorsqu'il trouve la première, et au lieu de multiplier les valeurs de 50000 lignes ensemble, il suffit de localiser la valeur - il devrait donc fonctionner beaucoup mieux.
ErikE
@ErikE Sharp - Je pense aussi que votre technique s'arrête à la première découverte. Mais si vous avez beaucoup de valeurs uniques en C (exemple: seulement 50 ABC), vous continuerez à vérifier d'énormes quantités de données. Fonctionnalité intéressante: votre formule fonctionne mieux lorsque les données ne sont pas triées.
workglide
1

Excel 2013 peut faire Count distinct dans les pivots. Si aucun accès à 2013, et qu'il s'agit d'une plus petite quantité de données, je fais deux copies des données brutes, et dans la copie b, sélectionnez les deux colonnes et supprimez les doublons. Puis faites le pivot et comptez votre colonne b.

Zachary
la source
1

Vous pouvez utiliser COUNTIFS pour plusieurs critères,

= 1 / COUNTIFS (A: A, A2, B: B, B2) puis faites glisser vers le bas. Vous pouvez y mettre autant de critères que vous le souhaitez, mais cela prend généralement beaucoup de temps à traiter.

user5100077
la source
1

Étape 1. Ajouter une colonne

Étape 2. Utilisez la formule = IF(COUNTIF(C2:$C$2410,C2)>1,0,1)dans le 1er enregistrement

Étape 3. Faites-le glisser vers tous les enregistrements

Étape 4. Filtrez «1» dans la colonne avec la formule

Abhishek Verma
la source
0

Vous pouvez créer une colonne supplémentaire pour stocker l'unicité, puis additionner que dans votre tableau croisé dynamique.

Ce que je veux dire, c'est que la cellule C1devrait toujours l'être 1. La cellule C2doit contenir la formule =IF(COUNTIF($A$1:$A1,$A2)*COUNTIF($B$1:$B1,$B2)>0,0,1). Copiez cette formule vers le bas pour que la cellule C3contienne=IF(COUNTIF($A$1:$A2,$A3)*COUNTIF($B$1:$B2,$B3)>0,0,1) et ainsi de suite.

Si vous avez une cellule d'en-tête, vous voudrez les déplacer vers le bas d'une ligne et votre C3formule devrait être =IF(COUNTIF($A$2:$A2,$A3)*COUNTIF($B$2:$B2,$B3)>0,0,1).

lc.
la source
0

Si vous avez les données triées .. je suggère d'utiliser la formule suivante

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

C'est plus rapide car il utilise moins de cellules pour calculer.

SumitB
la source
0

Je trie généralement les données par le champ dont j'ai besoin pour faire le décompte distinct puis utiliser IF (A2 = A1,0,1); vous obtenez alors un 1 dans la rangée supérieure de chaque groupe d'identifiants. Simple et ne prend pas de temps à calculer sur de grands ensembles de données.

Cache-oreilles généraux
la source
0

Vous pouvez également utiliser pour la colonne d'assistance VLOOKUP. J'ai testé et regarde un peu plus vite que COUNTIF.

Si vous utilisez l'en-tête et que les données commencent dans la cellule A2, dans n'importe quelle cellule de la ligne, utilisez cette formule et copiez-la dans toutes les autres cellules de la même colonne:

=IFERROR(IF(VLOOKUP(A2;$A$1:A1;1;0)=A2;0;1);1)
Marossik
la source
-3

J'ai trouvé un moyen plus simple de faire cela. En référence à l'exemple de Siddarth Rout, si je veux compter des valeurs uniques dans la colonne A:

  • ajoutez une nouvelle colonne C et remplissez C2 avec la formule "= 1 / COUNTIF ($ A: $ A, A2)"
  • faire glisser la formule vers le reste de la colonne
  • pivoter avec la colonne A comme étiquette de ligne et Sum {colonne C) dans les valeurs pour obtenir le nombre de valeurs uniques dans la colonne A
Mounir
la source
Logiquement, cela ne peut pas fonctionner pour l'OP car il ne regarde pas la colonne B. Comment allez-vous adapter cela pour travailler avec plusieurs colonnes?
ErikE