web-dev-qa-db-ja.com

選択した列のすべての組み合わせを表示する

Google Spreadsheetsに一連の文字があります:

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

最初の行には、テンプレートとして機能する文字パターンが含まれています。後続の各行には、一部の列の値のvariantsが含まれます。最初の行の値は、バリアントを含まない列に使用されます。

バリアントを含む列ごとに1〜2個のバリアントがあり、これらの列は必ずしも同じ数のバリアントを持つとは限りません。将来、この問題には、列ごとに3つ以上のバリアントが含まれる可能性があります。

シーケンスのすべてのバリエーションを取得するにはどうすればよいですか?といった:

UY04XN
HY04XN
UY04YN
HY04YN
...

これは「デカルト製品」と関係があると思いますが、SQLはおおよそ次の形式になると思います。

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

...しかし、それがどのように柔軟なスプレッドシート関数コードに変換されるかはわかりません。

4
yellow-saint

簡潔な答え

QUERY()はSQLのサブセットの使用を許可しますが、このサブセットにはFROM句は含まれません。

QUERY()はソーステーブルとして単一の配列を必要とするため、使用できません。代わりにARRAYFORMULA()、TRANSPOSE()、JOIN()、SPLIT()、REPT()、FILTER()、COUNTA()、SORTを使用してください()および除算(/)および連結(&)演算子は、パフォーマンスがカスタム関数よりも優れているため、「柔軟な式」を構築します。

手順

「柔軟なスプレッドシート関数コード」の場合、OPは式を意味すると仮定すると、

  1. 物事を簡単にするために、各数値の前にアポストロフィを追加して、テキストとしてフォーマットします。

注:他の方法では、数値列にCOUNTAの代わりにCOUNTを使用する必要があります。これは、後で追加されるすべての列の値が数値である場合にのみ機能するため、次の手順の柔軟性が低下します。

  1. デカルト積 のサイズを計算します。

H1:

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

注:OPが提供するサンプルデータに一致する5つの列があります。

  1. デカルト積を計算します。

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

説明

f1(A):A列の値を繰り返す必要がある$H$1/COUNTA(A:A)回数。

f2(A):列Aのfilter(A:A,LEN(A:A))値.

f3(A):TRANSPOSE(split(REPT(JOIN(",",TRANSPOSE(f2))&",",f1),","))は列の値を繰り返します

f4(A-B):SORT(f3(A)&f3(B),1,TRUE)列の最初のペアを連結し、昇順で並べ替えます。

f5():f4(A-B)&f3(C)&f3(D)&f3(E)&f3(F)他の列の行を連結します。この列の1つだけに複数の要素があるため、それらを再度並べ替える必要はありません。

注:各列に1つのf3()式があります。 OPによって提供されるサンプルデータに一致する5つがあります。

f6():ArrayFormula(f5()): "配列数式から返された値の複数の行や列への表示、および配列での非配列関数の使用を有効にします"1

デモスプレッドシート

参照資料

5
Rubén