您可以在Google表格中执行UNION SELECT吗?


10

我有一个链接到表格的Google表格,该表格使用相同的表格并进行了3次编辑,收集了来自同一主题上三个不同人的回复。这将创建一个包含三列的表格,说明这三个人的位置。

我需要生成一个视图/查询,该视图/查询将这三列放置在彼此的“下方”,而不是彼此相邻。在数据库中,我会做类似下面的查询的操作,我将我的“工作表”命名为tblMain,并说明了相关的四列(我还需要主题ID)。

tblMain:

ID        RALocation        RBLocation        RCLocation

查询:

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

有人知道Google表格中是否有这样做的方法吗?我不介意构建多个表,然后在最后将它们合并,但是我对如何执行此操作有些困惑。


行数是固定的还是随时间变化的?
鲁本2015年

Answers:


3

我提供两个版本,具体取决于是否应保留空白单元格。基本思想是相同的:

  1. 选择表中不包含的字符(例如,可通过访问的奇异Unicode字符CHAR)。
  2. JOIN命令中为三列中的每一列使用它。
  3. 连接结果,在两者之间添加字符。
  4. SPLIT 由相同字符连接的字符串。
  5. TRANSPOSE 结果。

例如:

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

在哪里进行联接/拆分,我选择了一个字符CHAR(57344),该字符指定供私人使用,因此不应出现在任何有效输入中。

上面的公式删除了空白条目,因为这是这样SPLIT做的。如果您的数据没有空白,这可能很方便:省去了跟踪数据最后一行的位置的麻烦。但是其他时候,应该保留空白。

为了保留空格,我遵循Jacob Jan Tuinstra的回答,只是我使用了另一个私有的Unicode而不是空格(谁知道,也许您有一些仅包含空格的单元格,并且您想保留这些空格)。这涉及两个额外的步骤:在像以前一样加入所有内容之后,我使用SUBSTITUTE替换CHAR(57344)CHAR(57344)&CHAR(57345),然后像以前一样拆分,然后替换CHAR(57345)为空字符串。

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

完整结果如下所示(注意,现在我指定数据的最后一行在哪里):

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

还有一个警告:Google表格中的字符串长度不能超过50000个字符。如果您的数据太大而无法使用基于字符串的方法,请使用脚本(是一个很好的起点)。


那很有效,我可以将它们结合起来以得到正确的结果。我现在想要做的唯一一件事就是让它尊重NULL值并将其移过来,事实证明您不需要FILTER,如果找到NULL值,它将把它们取出。我知道如何尊重NULL吗?
AnneB

1
实际上,“其他答案”此时只是部分答案。除了其他替代方案之外,相关的缺失部分还涉及如何使用嵌入式数组而不是UNION-SELECT方法。
鲁本

2
精彩。我可能要看看飞行员何时结束的脚本,但现在我已经足够继续。这里的人真的很有帮助,谢谢大家!
AnneB


2

简短答案

Google表格是一种非常强大的工具,可以通过多种方法来实现类似于UNION-SELECT的结果。

备择方案

嵌入式阵列

使用SPLIT-TRANSPOSE-JOIN-CHAR方式的另一种方法是使用嵌入式数组。这种方法的一个优点是它不需要构造/解构字符串,因此,字符数的限制是无关紧要的。

嵌入式阵列

筛选

对于需要过滤以具有类似UNION-SELECT行为的情况,以上内容可以与FILTER()结合使用。例

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

也可以与QUERY()结合使用,但其结果包括标题行。要了解如何清除标题,请参阅Google Spreadsheets查询结果中的清除行

如何创建一列值

使用TRANSPOSE-SPLIT-REPT创建一列值。

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

也可以使用QUERY()创建一列值,但是删除标题行会使公式更复杂。仅当字符串长度限制导致问题时才使用它。

使用嵌入式阵列和TRANSPOSE-SPLIT-REPT的解决方案

假定范围tblMain是A1:D7,其中A1:D1是表头,数据在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),","))}}

参考文献

附加谷歌电子表格数组-代码日志


您必须从我这里阅读更多答案;)。我尚未找到有关此的官方帮助文章。我知道Google产品论坛和Internet上都有线程,就像我已经包含的参考一样。
鲁本

谢谢您,我目前正在寻找最后一个解决方案,我认为它将对我们的飞行员非常有用!
AnneB
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.