Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用另一个表中的日期条件求和_Sql_Google Bigquery - Fatal编程技术网

Sql 使用另一个表中的日期条件求和

Sql 使用另一个表中的日期条件求和,sql,google-bigquery,Sql,Google Bigquery,我希望根据合同类型(月到月或长期)和未来的日期标准,计算收入和产品投放数量的总和。例如,我想知道我们的MRR有多少来自MTM合同和2019年1月1日的长期合同,以此类推 我们有两种类型的合同:月到月(MTM)和长期合同。我们的客户合同在到期时会转换为MTM(MTM到期月份),因此我们试图准确地想象未来将有多少转换为MTM。MRR是每月的经常性收入,所以本质上是收入 我想计算的是什么 如果MRR退出月份(如2019-04-01)>月份(如2019-01-01),则对MRR求和。这是每月的经常性收入

我希望根据合同类型(月到月或长期)和未来的日期标准,计算收入和产品投放数量的总和。例如,我想知道我们的MRR有多少来自MTM合同和2019年1月1日的长期合同,以此类推

我们有两种类型的合同:月到月(MTM)和长期合同。我们的客户合同在到期时会转换为MTM(MTM到期月份),因此我们试图准确地想象未来将有多少转换为MTM。MRR是每月的经常性收入,所以本质上是收入

我想计算的是什么

如果MRR退出月份(如2019-04-01)>月份(如2019-01-01),则对MRR求和。这是每月的经常性收入

如果MRR退出月份(如2019-01-01)<月份(2019-02-01)和MRR。这是长期MRR

这是我的数据表:

Companies | Placement |  MRR  | Start_Date | term_length | MRR_Exiting_Month
ANTON     | 2         |  300  | 2018-01-01 | 13          | 2019-02-01
ANKER     | 1         |  600  | 2018-07-01 | 6           | 2019-01-01
ANTON     | 2         |  300  | 2018-08-15 | 7           | 2019-02-01
ANTON     | 2         |  500  | 2018-10-01 | 5           | 2019-03-01
ANTON     | 2         |  300  | 2018-08-01 | 8           | 2019-04-01
我使用以下公式计算了每月的MRR\u:

date_add(parse_date('%F',start_date), INTERVAL term_length MONTH) as contract_end_month
我使用
generate_date_array
在不同的表中填充接下来的月份,但不确定如何在不连接它们的情况下从两个不同的表中使用case。我期待着这样的结果:

Month      | MTM MRR   |  Long Term MRR  | 
2018-10-01 | 0         |  2000           | 
2018-11-01 | 0         |  2000           | 
2018-12-01 | 0         |  2000           | 
2019-01-01 | 600       |  1400           | 
2019-02-01 | 1200      |  800            | 
2019-03-01 | 1700      |  300            | 
2019-04-01 | 2000      |  0              | 
2019-05-01 | 2000      |  0              | 
如果MRR月大于未来某个月,我正在考虑将MRR和安置相加。理想情况下,结果表如下所示:

Month      | MTM MRR   |  Long Term MRR  | 
2018-10-01 | 0         |  2000           | 
2018-11-01 | 0         |  2000           | 
2018-12-01 | 0         |  2000           | 
2019-01-01 | 600       |  1400           | 
2019-02-01 | 1200      |  800            | 
2019-03-01 | 1700      |  300            | 
2019-04-01 | 2000      |  0              | 
2019-05-01 | 2000      |  0              | 

在BigQuery中,最好的方法是什么?我感谢你的帮助

下面是BigQuery标准SQL的示例

#standardSQL
WITH months AS (
  SELECT month
  FROM UNNEST(GENERATE_DATE_ARRAY('2018-10-01', '2019-05-01', INTERVAL 1 MONTH)) month
)
SELECT 
  month, 
  SUM(IF(MRR_Exiting_Month <= month, MRR, 0)) MTM_MRR,
  SUM(IF(MRR_Exiting_Month > month, MRR, 0)) Long_Term_MRR 
FROM months 
CROSS JOIN `project.dataset.table` t
GROUP BY month

向我们显示数据库模式、示例数据、当前和预期输出。请阅读,这里是学习如何提高问题质量和获得更好答案的好地方。是,请提供输入数据和预期输出的示例。理想情况下,将输入数据与语句一起呈现,以便我们关注您的问题,而不是再现您的数据:o)我将相应地调整问题。谢谢你的邀请feedback@JuanCarlosOropeza@Mikhailberlyan我只是编辑了这个问题。请让我知道这是否足够。对不起,我对编码世界还是新手。我一直在阅读stackoverflow的教程,但是还有很多东西要学呢谢谢你的回答!!我会到处玩看看。如果我的原始表中不存在MRR\u Exiting\u Month列,它会改变什么吗?我必须自己计算那个专栏。可能在这种情况下使用另一个子查询?当然。你已经得到了你所要求的——这取决于你去适应你在现实中所拥有的一切。考虑接受答案,同时投票吧!谢谢你,这帮了大忙!
Row month       MTM_MRR Long_Term_MRR    
1   2018-10-01  0       2000     
2   2018-11-01  0       2000     
3   2018-12-01  0       2000     
4   2019-01-01  600     1400     
5   2019-02-01  1200    800  
6   2019-03-01  1700    300  
7   2019-04-01  2000    0    
8   2019-05-01  2000    0