Pouvez-vous faire UNION SELECT dans une feuille Google?

10

J'ai une feuille Google liée à un formulaire qui recueille les réponses de trois personnes différentes sur le même sujet en utilisant le même formulaire et en les éditant trois fois. Cela crée une feuille qui contient trois colonnes indiquant où se trouvent les trois personnes.

J'ai besoin de produire une vue / requête qui prend ces trois colonnes et les place «en dessous» les unes des autres, et non les unes à côté des autres. Dans une base de données, j'aurais fait quelque chose comme la requête ci-dessous, j'ai appelé ma «feuille» tblMain et indiqué les quatre colonnes pertinentes (j'ai également besoin de l'ID du sujet).

tblMain:

ID        RALocation        RBLocation        RCLocation

Requete:

Select ID, RALocation as Location, 'RA' as Role from tblMain
Union
Select ID, RBLocation as Location, 'RB' as Role from tblMain
Union
Select ID, RCLocation as Location, 'RC' as Role from tblMain

Est-ce que quelqu'un sait s'il existe un moyen de le faire dans Google Sheets? Cela ne me dérange pas de construire plus d'une feuille et de les combiner à la fin, mais je suis un peu coincé sur la façon de procéder.

AnneB
la source
Le nombre de lignes est-il fixe ou va-t-il changer avec le temps?
Rubén

Réponses:

3

J'offre deux versions, selon que les cellules vides doivent être conservées. L'idée de base est la même:

  1. Choisissez un caractère qui ne figure pas dans votre table (par exemple, un caractère Unicode exotique accessible via CHAR).
  2. Utilisez-le dans la JOINcommande pour chacune des trois colonnes.
  3. Concatène les résultats en ajoutant le caractère entre les deux.
  4. SPLIT la chaîne concaténée par le même caractère.
  5. TRANSPOSE le résultat.

Par exemple:

=TRANSPOSE( SPLIT( JOIN(CHAR(57344),A1:A) &CHAR(57344)& JOIN(CHAR(57344),B1:B) &CHAR(57344)& JOIN(CHAR(57344),C1:C), CHAR(57344) ) )

où pour rejoindre / fractionner, j'ai choisi le caractère CHAR(57344), qui est destiné à un usage privé et ne doit donc pas être présent dans une entrée valide.

La formule ci-dessus supprime les entrées vides , car c'est ce qui SPLITfait. Cela peut être pratique si vos données ne comportent pas de blancs: vous évite de suivre où se trouve la dernière ligne des données. Mais d'autres fois, les blancs doivent être conservés.

Pour préserver les blancs, je suis la réponse de Jacob Jan Tuinstra, sauf que j'ai utilisé un autre Unicode à usage privé au lieu de l'espace (qui sait, peut-être que vous avez des cellules qui ne contiennent qu'un espace et que vous souhaitez les conserver). Cela implique deux étapes supplémentaires: après avoir tout joint comme avant, j'utilise SUBSTITUTEpour remplacer CHAR(57344)par CHAR(57344)&CHAR(57345), puis diviser comme avant et remplacer CHAR(57345)par une chaîne vide.

=TRANSPOSE( ARRAYFORMULA(SUBSTITUTE( SPLIT( SUBSTITUTE(...joins... , CHAR(57344),CHAR(57344)&CHAR(57345)), CHAR(57344) ), CHAR(57345), "")))

Le résultat complet ressemble à ceci (notez que maintenant je spécifie où se trouve la dernière ligne de données):

=TRANSPOSE( ARRAYFORMULA(SUBSTITUTE( SPLIT( SUBSTITUTE(JOIN(CHAR(57344),A1:A9) &CHAR(57344)& JOIN(CHAR(57344),B1:B9) &CHAR(57344)& JOIN(CHAR(57344),C1:C9), CHAR(57344),CHAR(57344)&CHAR(57345)), CHAR(57344) ), CHAR(57345), "" )))

Une autre mise en garde: les chaînes dans Google Sheets ne peuvent pas dépasser 50000 caractères. Si vos données sont trop volumineuses pour que l'approche basée sur des chaînes fonctionne, utilisez un script ( celui-ci est un bon point de départ).

Communauté
la source
Cela fonctionne un régal, et je peux les combiner pour obtenir le bon résultat. La seule chose que j'essaie maintenant de faire est de le faire respecter les valeurs NULL et de les tirer, il s'avère que votre FILTER n'était pas nécessaire, il les supprimera s'il trouve des valeurs NULL. Une idée comment je le fais pour respecter le NULL?
AnneB
1
En fait, «l'autre réponse» est une réponse partielle à l'heure actuelle. Outre d'autres alternatives, la partie manquante pertinente concerne la façon d'utiliser les tableaux intégrés au lieu de l'approche UNION-SELECT.
Rubén
2
Magnifique. Je devrai probablement regarder le script quand notre pilote sera terminé, mais pour l'instant j'ai assez pour continuer. Les gens ici sont vraiment utiles, merci à tous!
AnneB
3

Il est possible de faire une union dans Google Spreadsheet très facilement de nos jours avec cette formule:

={'Sheet1'!A2:A;'Sheet2'!A2:A;'Sheet3'!A2:A}

Voir plus d'informations dans l'aide de Google Docs: Utilisation de tableaux dans Google Sheets

Emilio Nicolás
la source
2

Réponse courte

Google Sheets est un outil très puissant qui propose plusieurs alternatives pour obtenir un résultat similaire à UNION-SELECT.

Alternatives

Tableaux intégrés

Une alternative à l'utilisation de SPLIT-TRANSPOSE-JOIN-CHAR est d'utiliser des tableaux intégrés. Un avantage de cette méthode est qu'elle ne nécessite pas de construire / déconstruire des chaînes, donc la limite du nombre de caractères n'est pas pertinente.

Baie intégrée

Filtration

Ce qui précède peut être utilisé en combinaison avec FILTER () pour les cas qui nécessitent un filtrage pour avoir un comportement similaire à UNION-SELECT. Exemple

={Filter(A1:B2, B1:B2=2);Filter(D1:E2, E1:E2=6);Filter(G1:H2, H1:H2=12)}

Peut également être utilisé en combinaison avec QUERY () mais ses résultats incluent une ligne d'en-têtes. Pour en savoir plus sur la suppression des en-têtes, voir Supprimer la ligne à la suite de la requête Google Spreadsheets .

Comment créer une colonne de valeurs

Utilisez TRANSPOSE-SPLIT-REPT pour créer une colonne de valeurs.

={Transpose(Split(REPT("RA,",6),","))}

QUERY () pourrait également être utilisé pour créer une colonne de valeurs, mais la suppression de la ligne des en-têtes pourrait rendre la formule plus complexe. Utilisez-le uniquement si les limitations de longueur de chaîne posent problème.

Solution utilisant des baies intégrées et TRANSPOSE-SPLIT-REPT

Supposons que la plage tblMain soit A1: D7, où A1: D1 sont les en-têtes de table et que les données sont en A2: D7.

={{"ID";A2:A7;A2:A7;A2:A7},
{"Location";B2:B7;C2:C7;D2:D7},{"Role";
Transpose(Split(REPT("RA,",6),","));
Transpose(Split(REPT("RB,",6),","));
Transpose(Split(REPT("RC,",6),","))}}

Références

Ajout de tableaux de feuilles de calcul Google - StackOverflow

Rubén
la source
Vous devez lire plus de réponses de ma part;). Je n'ai pas encore trouvé d'articles d'aide officiels à ce sujet. Je sais qu'il y a des fils dans les forums des produits Google et sur Internet, comme la référence que j'ai déjà incluse.
Rubén
Merci pour cela, je regarde actuellement la dernière solution, je pense que cela fera très bien l'affaire pour notre pilote!
AnneB