web-dev-qa-db-fra.com

Pouvez-vous faire un UNION SELECT dans une feuille Google?

J'ai une feuille Google liée à un formulaire qui collecte les réponses de trois personnes différentes sur le même sujet en utilisant le même formulaire et en le révisant trois fois. Cela crée une feuille contenant trois colonnes indiquant l'emplacement des trois personnes.

J'ai besoin de produire une vue/requête qui prend ces trois colonnes et les place les unes en dessous 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 énoncé les quatre colonnes appropriées (j'ai également besoin de l'ID de 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 y a moyen de le faire dans Google Sheets? Cela ne me dérange pas de construire plus d’une feuille puis de les combiner à la fin, mais je suis un peu coincé sur la façon de procéder.

9
AnneB

Je propose deux versions, selon que les cellules vierges doivent être conservées ou non. L'idée de base est la même:

  1. Choisissez un caractère qui ne figure pas dans votre tableau (par exemple, un caractère Unicode exotique accessible via CHAR ).
  2. Utilisez-le dans la commande JOIN pour chacune des trois colonnes.
  3. Concaténer 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/séparer, j'ai choisi le caractère CHAR(57344), qui est destiné à un usage privé et ne doit donc pas figurer dans une entrée valide.

La formule ci-dessus supprime les entrées vides , car c’est ce que SPLIT fait. Cela peut être pratique si vos données ne comportent pas de blancs: cela vous évite d'avoir à suivre l'emplacement de la dernière ligne des données. Mais d'autres fois, les blancs doivent être préservés.

Pour préserver les blancs, je suis la réponse de Jacob Jan Tuinstra sauf que j'ai utilisé un autre usage privé Unicode au lieu de l'espace (qui sait, peut-être que vous avez des cellules qui ne contiennent qu'un espace et que vous souhaitez conserver ). Cela implique deux étapes supplémentaires: après avoir tout réuni comme avant, j'utilise SUBSTITUTE pour remplacer CHAR(57344) par CHAR(57344)&CHAR(57345), puis scindé comme auparavant et remplace 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), "" )))

Encore une 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 une approche basée sur des chaînes, utilisez un script ( celui-ci est un bon point de départ).

3
user79865

Il est possible de créer très facilement une union dans Google Spreadsheet avec cette formule:

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

Pour plus d'informations dans l'aide de Google Documents: tilisation de tableaux dans Google Sheets

3
Emilio Nicolás

Réponse courte

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

Des alternatives

Matrices incorporées

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

Emdedded array

Filtration

Ce qui précède peut être utilisé en combinaison avec FILTER () pour les cas nécessitant un filtrage afin d’avoir un comportement similaire de 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ête. Pour savoir comment se débarrasser des en-têtes, voir Se débarrasser de la ligne dans le résultat 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),","))}

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

Solution utilisant des tableaux intégrés et TRANSPOSE-SPLIT-REPT

Supposons que la plage tblMain soit A1: D7, où A1: D1 correspond aux en-têtes du tableau et que les données sont au format 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 tableurs Google - StackOverflow

2
Rubén