it-swarm.com.de

Alle Kombinationen für eine Auswahl von Spalten anzeigen

Ich habe eine Folge von Buchstaben in Google Spreadsheets:

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

Die erste Zeile enthält ein Zeichenmuster, das als Vorlage dient. Jede nachfolgende Zeile enthält Varianten der Werte in einigen Spalten. Die ersten Zeilenwerte werden für Spalten verwendet, die keine Varianten enthalten.

Es gibt zwischen 1 und 2 Varianten pro Spalte mit Varianten, und diese Spalten müssen nicht unbedingt die gleiche Anzahl von Varianten aufweisen. In Zukunft könnte das Problem möglicherweise drei oder mehr Varianten pro Spalte haben.

Wie kann ich alle Variationen der Sequenz bekommen? Sowie:

UY04XN
HY04XN
UY04YN
HY04YN
...

Ich glaube, das hat etwas mit 'Cartesian Products' zu tun, und ich nehme an, dass die SQL ungefähr so ​​aussehen würde:

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

... aber ich habe keine Ahnung, wie sich das in flexiblen Tabellenkalkulations-Funktionscode niederschlagen würde.

4
yellow-saint

Kurze Antwort

QUERY () erlaubt die Verwendung einer Teilmenge von SQL, diese Teilmenge enthält jedoch nicht die FROM-Klausel.

Für QUERY () ist ein einzelnes Array als Quellentabelle erforderlich, daher kann es nicht verwendet werden. Verwenden Sie stattdessen ARRAYFORMULA (), TRANSPOSE (), JOIN (), SPLIT (), REPT (), FILTER (), COUNTA (), SORT () und die Operatoren Division (/) und Verketten (&), um eine "flexible Formel" zu erstellen, da ihre Leistung besser ist als eine benutzerdefinierte Funktion.

Verfahren

Unter der Annahme, dass für "flexiblen Tabellenkalkulationsfunktionscode" das OP eine Formel bedeutet,

  1. Fügen Sie zur Vereinfachung vor jedem Zahlenwert ein Apostroph ein, um sie als Text zu formatieren.

Hinweis: Auf andere Weise muss COUNT anstelle von COUNTA für numerische Spalten verwendet werden. Dadurch wird das folgende Verfahren weniger flexibel, da dies in Zukunft nur dann funktioniert, wenn alle später hinzugefügten Spaltenwerte Zahlen sind.

  1. Berechnen Sie die Größe für das kartesische Produkt .

H1:

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

Hinweis: Es gibt fünf Spalten, die den vom OP bereitgestellten Beispieldaten entsprechen.

  1. Berechnen Sie das kartesische Produkt:

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)),","))
  }
)

Erläuterung

f1 (A): $H$1/COUNTA(A:A) Häufigkeit, mit der die A-Spaltenwerte wiederholt werden sollen.

f2 (A): filter(A:A,LEN(A:A)) Werte in Spalte A.

f3 (A): TRANSPOSE(split(REPT(JOIN(",",TRANSPOSE(f2))&",",f1),",")) wiederholt die Spaltenwerte

f4 (A-B): SORT(f3(A)&f3(B),1,TRUE) Verkettet das erste Spaltenpaar und sortiert sie in aufsteigender Reihenfolge.

f5 (): f4(A-B)&f3(C)&f3(D)&f3(E)&f3(F) Verkettet die anderen Spaltenzeilen. Da nur eine dieser Spalten mehr als ein Element enthält, ist es nicht erforderlich, sie erneut zu sortieren.

Hinweis: Für jede Spalte gibt es eine f3 () -Formel. Es gibt fünf, die mit den vom OP bereitgestellten Beispieldaten übereinstimmen.

f6 (): ArrayFormula(f5()): "Aktiviert die Anzeige von Werten, die von einer Array-Formel zurückgegeben wurden, in mehrere Zeilen und/oder Spalten und die Verwendung von Nicht-Array-Funktionen mit Arrays."1.

Demo-Tabelle

Verweise

5
Rubén