【问题标题】:How to sort Google Sheets query result by column values (month names), numerically and within the query statement itself?如何按列值(月份名称)、数字和查询语句本身对 Google 表格查询结果进行排序?
【发布时间】:2019-11-28 09:58:42
【问题描述】:

我有一个公式可以聚合来自外部工作表的IMPORTRANGE 数据,然后组合多个查询的输出,效果相当好:

={IFERROR(QUERY({
IFERROR(IMPORTRANGE('C1'!C3, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C4, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C5, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C6, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C7, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C8, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C9, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C10, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C11, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C12, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C13, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C14, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C15, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C16, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C17, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C18, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C19, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C20, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C21, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C22, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C23, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C24, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C25, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C26, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C27, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C28, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C29, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C30, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""});
IFERROR(IMPORTRANGE('C1'!C31, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""})},
"SELECT * WHERE Col8 IS NOT NULL AND Col1='PERSONAL' OR Col1='RESOURCER' OR Col1='NEW' ORDER BY Col12 desc", 0),{"","","","","","","","","","","",""});
IFERROR(QUERY({IFERROR(IMPORTRANGE(MANAGERSHEET, "PLACEMENTS!A4:L200"), {"","","","","","","","","","","",""})},
"SELECT * WHERE Col8 IS NOT NULL AND Col1='PERSONAL' OR Col1='RESOURCER' ORDER BY Col12 desc", 0),{"","","","","","","","","","","",""})}

Col3 在此查询中导入为表示月份的字符串值(“January”、“February”、“March”等)。我也在考虑一一明确选择列 (SELECT Col1, Col2, Col3, etc) 以获得更大的灵活性。

我试图弄清楚是否有可能在查询语句中 转换(或解释)这个月份的值字符串,以便我可以按月份按数字排序。即一月 = 1,二月 = 2,等等。

我已尝试查看官方的 Google 查询语言参考(0.7 版),但似乎没有一个标量函数能够实现我想要做的事情,或者至少不能以我已经尝试过的任何方式实现试过了。谷歌搜索这个问题也没有找到任何指针,大多数结果与数字到月份的字符串转换有关,或者暗示了一些不能在查询本身中使用的谷歌表格原生函数。

这是否可以在 Google 表格中的 Google 查询语言中实现,而无需单独添加列?

可以在SELECT 过程中将月份名称转换为数值,还是可以通过ORDER 子句将其解释为数字?

【问题讨论】:

    标签: google-sheets google-sheets-formula array-formulas google-sheets-query google-query-language


    【解决方案1】:

    如果您的月份是有效日期,那么您可以这样做:

    =QUERY(A1:A5, "order by month(A)", 0)
    


    否则,您将需要转换它:

    =ARRAYFORMULA(QUERY({A1:A5, MONTH(A1:A5&1)}, "select Col1 order by Col2"))
    


    将月份名称转换为数字:

    =MONTH("August"&1)
    

    【讨论】:

    • 感谢您的建议。您使用 MONTH() 函数转换它的建议似乎可以工作,因为这些值是字符串,但困难是我已经将很多 IMPORTRANGE 值放在一个数组中。我将如何使用 MONTH() 函数仅转换 Col3?
    • 最简单的方法是在您的电子表格中添加一个带有 arrayformula 的帮助列,您可以从中执行导入范围 - =ARRAYFORMULA(MONTH(C4:C200&1))。如果这不可能,那么您可以将它组装成更长但也可以工作的数组 - =IFERROR({IMPORTRANGE('C1'!C3, "PLACEMENTS!A4:B200"),MONTH(IMPORTRANGE('C1'!C3, "PLACEMENTS!C4:C200")&1),IMPORTRANGE('C1'!C3, "PLACEMENTS!D4:L200")}, {"","","","","","","","","","","",""}) 而不是一个导入范围。并将你的整个公式包装成ARRAYFORMULA()。这会将第三列从字符串转换为数字
    • 我没有得到预期的输出,IFERROR() 函数没有帮助,所以我已经将它剥离到基础,并发现为此:=MONTH(IMPORTRANGE('C1'!C3, "PLACEMENTS!C4:C200")&1)I '得到一个“9”的值,这是有道理的,但它显然不是将 MONTH() 函数应用于导入的范围,而是应用于单个值。我已经尝试过=IMPORTRANGE('C1'!C3, "PLACEMENTS!C4:C200"),它按预期工作,并将月份名称列表显示为列中的字符串值,因此 MONTH() 函数仅解析并返回一行/值。有什么想法吗?
    • 好的,这似乎可以为月份字符串获取一列数值:=ARRAYFORMULA(MONTH(IMPORTRANGE('C1'!C3, "PLACEMENTS!C4:C200")&1))。现在开始合并到公式的其余部分。
    • 原来格式化功能与谷歌表格不兼容:support.google.com/docs/forum/AAAABuH1jm0YnkXpXCD4rI/…。如何使用数值进行排序但将值显示为月份的字符串名称?即“一月”而不是“1”编辑:我通过在 Google 表格中应用一种自定义格式来实现这一点,该格式将数字转换为月份名称。
    猜你喜欢
    • 1970-01-01
    • 2019-03-09
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多