【问题标题】:Query a count of unique attributes in a table查询表中唯一属性的计数
【发布时间】:2018-07-18 21:35:22
【问题描述】:

我有一张这样的桌子:

+--------+-------+--------+-------+
| attr1  | attr2 | attr3  | attr4 |
+--------+-------+--------+-------+
| purple | wine  | clear  |  10.0 |
| red    | wine  | solid  |  20.0 |
| red    | beer  | cloudy |  10.0 |
| purple | ale   | clear  |  34.0 |
| blue   | ale   | solid  |  16.0 |
+--------+-------+--------+-------+

我想这样改造:

+--------+-------+-------+-------+-------+
|        | attr1 | attr2 | attr3 | attr4 |
+--------+-------+-------+-------+-------+
| purple |     2 |       |       |       |
| red    |     2 |       |       |       |
| blue   |     1 |       |       |       |
| wine   |       |     2 |       |       |
| beer   |       |     1 |       |       |
| ale    |       |     2 |       |       |
| clear  |       |       |     2 |       |
| solid  |       |       |     2 |       |
| cloudy |       |       |     1 |       |
| 10.0   |       |       |       |     2 |
| 20.0   |       |       |       |     1 |
| 34.0   |       |       |       |     1 |
| 16.0   |       |       |       |     1 |
+--------+-------+-------+-------+-------+

这个透视表或交叉表将显示每个属性值在各自列中的计数。

如何使用 Google Query 语言来显示这样的交叉表?

【问题讨论】:

  • @pnuts 谢谢,你的 cmets 真的很有帮助。 :)
  • 容易吗?这让我摸不着头脑。
  • @Tom 用几个公式可能很容易(不像你计划的单行:)
  • 太晚了!但它变得很长。
  • 我完全赞成更简洁和/或更简单的方法 - 那会是 unique 和 countifs 之类的吗?

标签: google-sheets pivot-table google-query-language


【解决方案1】:

好吧,如果数据分两列排列,那就很简单了,例如对于这样的事情

Attrib  Column
Red     1
Red     1
Green   1
Blue    1
Beer    2
Ale     2
Ale     2

你可以使用类似的查询

=query(A:B,"select A,count(A) where A<>'' group by A pivot  B")

所以问题是将 OP#s 数据组织成两列。

这可以通过目前相当标准的拆分/连接/转置技术来完成

=ArrayFormula(split(transpose(split(textjoin("|",true,if(A2:D="","",A2:D&" "&column(A2:D))),"|"))," "))

给予

您可以对结果运行查询,也可以像这样将两者结合起来

 =ArrayFormula(query({"Attrib","Number";split(transpose(split(textjoin("|",true,if(A2:D="","",column(A2:D)&"-"&A2:D&" "&column(A2:D))),"|"))," ")},"Select Col1,count(Col1) group by Col1 pivot Col2"))

我已将列号加入属性,例如1-蓝色,以便按正确的顺序排序。如果你不喜欢它,你可以使用 regexreplace 摆脱它。

编辑

略短的公式 - 我不需要单独放入标题:

=ArrayFormula(query(split(transpose(split(textjoin("|",true,if(A2:D="","",column(A2:D)&"-"&A2:D&" Attr"&column(A2:D))),"|"))," "),
"Select Col1,count(Col1) group by Col1 pivot Col2",0))

编辑 2

我那里有点厚,应该使用第一行 OP 的数据作为属性标签而不是列号

=ArrayFormula(query(split(transpose(split(textjoin("|",true,if(A2:D="","",column(A2:D)&"-"&A2:D&" "&A1:D1)),"|"))," "),
"Select Col1,count(Col1) group by Col1 pivot Col2",0))

编辑 3

应该选择一对更好的分隔符

    =ArrayFormula(query(split(transpose(split(textjoin("?",true,if(A2:D="","",column(A2:D)&"-"&A2:D&"?"&A1:D1)),"?")),"?"),
"Select Col1,count(Col1) group by Col1 pivot Col2",0))

【讨论】:

  • 我们如何用Attr1,Attr2,Attr3,Attr4替换标题1,2,3,4的值?
  • ??????恭喜10k??????
  • 干杯伙计们,这真是太好了 - 感谢您的支持,帮助实现了这一目标 ;-)
  • 关于有空格的标题,我不应该为分隔符选择空格(应该复制 |'-'| 并使用头骨或其他东西),而是像你在你的评论应该没问题吧?
  • @TomSharpe 将split function 包装成trim function 怎么样?似乎工作!但我喜欢你向Query 添加零参数的想法。 =arrayformula(QUERY(TRIM(split(transpose(split(textjoin("!",TRUE,if(TEST!A2:D="","",TEST!A2:D &amp; "~" &amp; TEST!A1:D1)),"!")),"~")),"SELECT Col1, COUNT(Col1) GROUP BY Col1 PIVOT Col2"))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多