如何在不手动更改 SOQL 查询条件的情况下进行批量计算?
How to compute in bulk without manually changing conditions in SOQL query?
假设我有一个类似这样的查询:
SELECT DISTINCT
AVG(x.Order_total) AS Average_order
FROM
(SELECT a.Order_ID, b.Customer, a.Order_date, a.Order_total
FROM Order_table a
JOIN Customer_table b
ON a.Order_ID = b.Order_ID
WHERE a.Store = 'Random_store'
AND a.Order_date BETWEEN 'Jan 01 2017 12:00AM' AND 'Feb 01 2017 12:00AM'
GROUP BY a.Order_ID, b.Customer, a.Order_date, a.Order_total) x
假设这个 returns 是 2017 年 1 月执行的所有交易的平均订单价值。
假设输出如下所示:
Average_order
000
但是,如果我还想计算接下来所有月份(2017 年 2 月、2017 年 3 月、2017 年 4 月、...2021 年 9 月)的平均订单价值并将其显示在一个 table 中而不需要手动更改日期并运行计算多次?
理想的输出应该是这样的(结果数字是随机的):
Month_and_year
Average_order
January 2017
000
February 2017
000
March 2017
500
...直到 2021 年 9 月的所有月份。(附加列不是必需的,但知道如何构建它会很有趣。)
我根本不是程序员,但我的猜测是利用某种 for 循环(我熟悉这个编程概念)运行所有剩余的月份和年份组合,但老实说 - 我不知道在 SQL.
中我将如何处理它
或者是否有更好的方法来批量运行这些计算?
如果它很重要,我正在使用 Salesforce 对象查询语言 (SOQL),它似乎并不总是完美的,但我绝对对任何 SQL 方言感兴趣。想法才是最重要的。
感谢您的任何建议!
您不一定需要在查询中使用 for 结构。如果你重新表述你的问题,你真正想要的是:一个查询将针对 startdate
和 enddate
之间的所有月份,计算该月所有订单的平均值。
或者换句话说:SELECT 订单总计的平均值按 ORDER_DATE.MONTH 和 ORDER_DATE.YEAR 分组,其中 ORDER_DATE 介于 startdate
和 enddate
.
另外:您当前的查询“正确”吗?当您从订单 table 中选择时,按订单 ID 分组似乎很奇怪 - 我假设订单 ID 已经是唯一的。或者它实际上是在计算每个客户的平均订单?我不知道。将来,显示来自 Order_table
和 Customer_table
的一些示例数据会很有用:)
尽我最大努力将 SOQL 文档中的代码示例结合在一起,但无法实际测试它,我认为您想要类似于以下内容的内容:
SELECT CALENDAR_YEAR(a.Order_date) AS 'Year', CALENDAR_MONTH(a.Order_date) AS 'Month', AVG(a.Order_total) AS 'Average order total'
FROM Order_table a
WHERE a.Store = 'Random_store'
AND a.Order_date BETWEEN 'Jan 01 2017 12:00' AND 'September 01 2021 12:00AM'
GROUP BY CALENDAR_YEAR(a.Order_date), CALENDAR_MONTH(a.Order_date)
ORDER BY 'Year', 'Month'
CALENDAR_MONTH 和 CALENDAR_YEAR 函数在 SOQL 中可用:https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_date_functions.htm
P.S。我假设 Order_table 和 Customer_table 具有一对一的关系(即 1 个订单有 1 个客户)
P.P.S。这里有一个专门针对 Salesforce 问题的 StackExchange:https://salesforce.stackexchange.com/
假设我有一个类似这样的查询:
SELECT DISTINCT
AVG(x.Order_total) AS Average_order
FROM
(SELECT a.Order_ID, b.Customer, a.Order_date, a.Order_total
FROM Order_table a
JOIN Customer_table b
ON a.Order_ID = b.Order_ID
WHERE a.Store = 'Random_store'
AND a.Order_date BETWEEN 'Jan 01 2017 12:00AM' AND 'Feb 01 2017 12:00AM'
GROUP BY a.Order_ID, b.Customer, a.Order_date, a.Order_total) x
假设这个 returns 是 2017 年 1 月执行的所有交易的平均订单价值。
假设输出如下所示:
Average_order |
---|
000 |
但是,如果我还想计算接下来所有月份(2017 年 2 月、2017 年 3 月、2017 年 4 月、...2021 年 9 月)的平均订单价值并将其显示在一个 table 中而不需要手动更改日期并运行计算多次?
理想的输出应该是这样的(结果数字是随机的):
Month_and_year | Average_order |
---|---|
January 2017 | 000 |
February 2017 | 000 |
March 2017 | 500 |
...直到 2021 年 9 月的所有月份。(附加列不是必需的,但知道如何构建它会很有趣。)
我根本不是程序员,但我的猜测是利用某种 for 循环(我熟悉这个编程概念)运行所有剩余的月份和年份组合,但老实说 - 我不知道在 SQL.
中我将如何处理它或者是否有更好的方法来批量运行这些计算?
如果它很重要,我正在使用 Salesforce 对象查询语言 (SOQL),它似乎并不总是完美的,但我绝对对任何 SQL 方言感兴趣。想法才是最重要的。
感谢您的任何建议!
您不一定需要在查询中使用 for 结构。如果你重新表述你的问题,你真正想要的是:一个查询将针对 startdate
和 enddate
之间的所有月份,计算该月所有订单的平均值。
或者换句话说:SELECT 订单总计的平均值按 ORDER_DATE.MONTH 和 ORDER_DATE.YEAR 分组,其中 ORDER_DATE 介于 startdate
和 enddate
.
另外:您当前的查询“正确”吗?当您从订单 table 中选择时,按订单 ID 分组似乎很奇怪 - 我假设订单 ID 已经是唯一的。或者它实际上是在计算每个客户的平均订单?我不知道。将来,显示来自 Order_table
和 Customer_table
的一些示例数据会很有用:)
尽我最大努力将 SOQL 文档中的代码示例结合在一起,但无法实际测试它,我认为您想要类似于以下内容的内容:
SELECT CALENDAR_YEAR(a.Order_date) AS 'Year', CALENDAR_MONTH(a.Order_date) AS 'Month', AVG(a.Order_total) AS 'Average order total'
FROM Order_table a
WHERE a.Store = 'Random_store'
AND a.Order_date BETWEEN 'Jan 01 2017 12:00' AND 'September 01 2021 12:00AM'
GROUP BY CALENDAR_YEAR(a.Order_date), CALENDAR_MONTH(a.Order_date)
ORDER BY 'Year', 'Month'
CALENDAR_MONTH 和 CALENDAR_YEAR 函数在 SOQL 中可用:https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_date_functions.htm
P.S。我假设 Order_table 和 Customer_table 具有一对一的关系(即 1 个订单有 1 个客户)
P.P.S。这里有一个专门针对 Salesforce 问题的 StackExchange:https://salesforce.stackexchange.com/