SUM使用另一个表中的日期条件

时间:2018-10-02 18:45:25

标签: sql google-bigquery

我希望将来将基于合同类型(按月或长期)与日期条件的收入和产品放置数量相加。例如,我想知道我们的MRR中有多少来自MTM合同以及2019年1月1日的长期合同等等。

我们有两种合同类型:月对月(MTM)和长期合同。我们的客户合同在到期时会转换为MTM(MTM到期月份),因此我们试图准确地可视化将来将转换为MTM的金额。 MRR是每月经常性收入,因此本质上是收入。

我要计算的内容

如果MRR退出月份(例如2019-04-01)>月(例如2019-01-01)THEN SUM MRR。这是每月的经常性收入。

IF MRR退出月份(例如2019-01-01)

这是我的数据表:

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_Exiting_Month:

date_add(parse_date('%F',start_date), INTERVAL term_length MONTH) as contract_end_month

我使用generate_date_array在另一个表中填充接下来的月份,但是不确定在不加入两个表的情况下如何使用案例。我期望这样的结果:

我正在考虑如果MRR_Exiting_Month大于将来的给定月份,则将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中这样做的最佳方法是什么?感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

以下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

您可以使用下面的问题中的虚拟数据进行测试,操作

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'ANTON' Companies, 2 Placement, 300 MRR, DATE '2018-01-01' Start_Date, DATE '2019-02-01' MRR_Exiting_Month UNION ALL
  SELECT 'ANKER', 1, 600, '2018-07-01', '2019-01-01' UNION ALL
  SELECT 'ANTON', 2, 300, '2018-08-15', '2019-02-01' UNION ALL
  SELECT 'ANTON', 2, 500, '2018-10-01', '2019-03-01' UNION ALL
  SELECT 'ANTON', 2, 300, '2018-08-01', '2019-04-01' 
), 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
-- ORDER BY 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