web-dev-qa-db-fra.com

Afficher toutes les combinaisons pour une sélection de colonnes

J'ai une séquence de lettres, en Google Spreadsheets:

  | A   B   C   D   E   F
--|----------------------
1 | U   Y   0   4   X   N
2 | H   X           Y   
3 | W

La première ligne contient un modèle de caractère qui sert de modèle. Chaque ligne suivante contient des variantes des valeurs de certaines des colonnes. Les premières valeurs de ligne sont utilisées pour les colonnes ne contenant pas de variantes.

Il y a entre 1 et 2 variantes par colonne comportant des variantes, et ces colonnes ne comportent pas nécessairement le même nombre de variantes. À l'avenir, le problème pourrait potentiellement avoir trois variantes ou plus par colonne.

Comment puis-je obtenir toutes les variations de la séquence? Tel que:

UY04XN
HY04XN
UY04YN
HY04YN
...

Je crois que cela a quelque chose à voir avec les "produits cartésiens", et je suppose que le code SQL serait approximativement de la forme:

SELECT table1.column1, table2.column2...
FROM  table1, table2...

... mais je ne sais pas comment cela se traduirait par un code de fonction de feuille de calcul flexible.

4
yellow-saint

Réponse courte

QUERY () autorise l'utilisation d'un sous-ensemble de SQL mais ce sous-ensemble n'inclut pas la clause FROM.

QUERY () requiert un tableau unique en tant que table source; elle ne peut donc pas être utilisée; utilisez plutôt ARRAYFORMULA (), TRANSPOSE (), JOIN (), SPLIT (), REPT (), FILTER (), COUNTA (), SORT () et les opérateurs de division (/) et concaténer (&) pour créer une "formule flexible", car ses performances sont meilleures qu'une fonction personnalisée.

Procédure

En supposant que pour "code de fonction de feuille de calcul flexible", OP signifie une formule,

  1. Pour simplifier les choses, ajoutez une apostrophe avant chaque valeur numérique afin de les formater en texte.

Remarque: Sinon, vous devrez utiliser COUNT au lieu de COUNTA pour les colonnes numériques, ce qui rendra la procédure suivante moins souple car cela ne fonctionnera à l'avenir que si toutes les valeurs de colonne ajoutées ultérieurement sont des nombres.

  1. Calculez la taille pour le produit cartésien .

H1:

=COUNTA(A:A)*COUNTA(B:B)*COUNTA(C:C)*COUNTA(D:D)*COUNTA(E:E)*COUNTA(F:F)

Remarque: Cinq colonnes correspondent aux exemples de données fournis par l'OP.

  1. Calculez le produit cartésien:

J1:

=ArrayFormula(
  {
     SORT(
       TRANSPOSE(         
       split(REPT(JOIN(",",TRANSPOSE(filter(A:A,LEN(A:A))))&",",$H$1/COUNTA(A:A)),","))
       &TRANSPOSE(         
       split(REPT(JOIN(",",TRANSPOSE(filter(B:B,LEN(B:B))))&",",$H$1/COUNTA(B:B)),","))
    ,1,TRUE)           
    &TRANSPOSE(         
       split(REPT(JOIN(",",TRANSPOSE(filter(C:C,LEN(C:C))))&",",$H$1/COUNTA(C:C)),","))
    &TRANSPOSE(         
       split(REPT(JOIN(",",TRANSPOSE(filter(D:D,LEN(D:D))))&",",$H$1/COUNTA(D:D)),","))         
    &TRANSPOSE(         
       split(REPT(JOIN(",",TRANSPOSE(filter(E:E,LEN(E:E))))&",",$H$1/COUNTA(E:E)),","))
    &TRANSPOSE(         
       split(REPT(JOIN(",",TRANSPOSE(filter(F:F,LEN(F:F))))&",",$H$1/COUNTA(F:F)),","))
  }
)

Explication

f1 (A): $H$1/COUNTA(A:A) nombre de fois où les valeurs de la colonne A doivent être répétées.

f2 (A): filter(A:A,LEN(A:A)) valeurs dans la colonne A.

f3 (A): TRANSPOSE(split(REPT(JOIN(",",TRANSPOSE(f2))&",",f1),",")) répète les valeurs de colonne

f4 (A-B): SORT(f3(A)&f3(B),1,TRUE) Concatène la première paire de colonnes et les trie par ordre croissant.

f5 (): f4(A-B)&f3(C)&f3(D)&f3(E)&f3(F) Concatène les lignes des autres colonnes. Comme une seule de ces colonnes contient plus d'un élément, il n'est pas nécessaire de les trier à nouveau.

Remarque: il existe une formule f3 () pour chaque colonne. Il y en a cinq pour apparier les exemples de données fournis par l'OP.

f6 (): ArrayFormula(f5()): "Active l'affichage des valeurs renvoyées par une formule matricielle dans plusieurs lignes et/ou colonnes et l'utilisation de fonctions autres que les matrices avec des tableaux"1.

tableur démo

Références

5
Rubén