【问题标题】:Bigquery calculate split from the beginning of month until end of month/current dateBigquery 计算从月初到月底/当前日期的拆分
【发布时间】:2021-05-21 08:44:33
【问题描述】:

我有一些问题,我想计算从月初到月底/当前日期的金额拆分,并按产品拆分如下:

数据:

Date_payment product amount
2020-02-01 aa 10
2020-02-01 aa 20
2020-02-03 bb 5
2020-02-29 bb 5
2020-03-01 aa 4
2020-03-03 aa 3
2020-03-03 bb 1

假设当前日期是 2020-03-05
我想从月初到月底/当前日期按产品和月份计算拆分

我的预期结果是:

Date_Report product Total_amount
2020-02-01 aa 30
2020-02-02 aa 30
2020-02-03 aa 30
2020-02-03 bb 5
2020-02-04 aa 30
2020-02-04 bb 5

....依此类推,直到..

Date_Report product Totalamount
2020-02-29 aa 30
2020-02-29 bb 10
2020-03-01 aa 4
2020-03-02 aa 4
2020-03-03 aa 7
2020-03-03 bb 1
2020-03-04 aa 7
2020-03-04 bb 1
2020-03-05 aa 7
2020-03-05 bb 1

我想查看每个月从月初到月底每天的总金额。

有人可以帮忙吗?

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    您需要生成天数,与产品交叉连接并引入现有数据:

    select report_date, p.product, coalesce(month_amount, 0) as month_amount
    from (unnest(generate_date_array(date('2020-01-01'), current_date, interval 1 day)) report_date cross join
         (select distinct product from t) p left join
         (select date_trunc(report_date, month) as mon, product, 
                 sum(amount) as month_amount
          from t
          group by 1, 2
         ) t
         on t.mon = date_trunc(report_date, month) and t.product = p.product;
        
    

    【讨论】:

      【解决方案2】:

      以下查询应该可以完成这项工作:

      SELECT
        DATE_TRUNC(Date_payment, MONTH) AS payment_month,
        product,
        SUM(amount) AS total_amount
      FROM
        transactions
      GROUP BY
        payment_month,
        product
      ORDER BY
        payment_month,
        product
      

      使用您提供的表格,结果是:

      【讨论】:

      • 我的意思是我想查看每个月从月初到月底每天的总金额
      • 感谢您的反馈,抱歉,我不明白您需要什么。因此,我认为@Gordon_linoff 的答案正是您想要的
      【解决方案3】:

      假设您的列如下:

      create table "Example"
      ( "DatePayment" date,
       "Product" nvarchar(5),
       "Amount" int
      );
      

      您的逻辑可能是(请更改为 BigQuery 语法):

      DO BEGIN
      
      DECLARE FIRSTDATE,LASTDATE DATE;
      SELECT TO_DATE(YEAR(MIN("DatePayment"))||'-'||MONTH(MIN("DatePayment"))||'-01') INTO FIRSTDATE FROM "Example";
      SELECT LAST_DAY(MAX("DatePayment")) INTO LASTDATE FROM "Example";
      
      VAR1= SELECT D."DT",E."Product",case when S."Amount" is null then 0 else S."Amount" end as "Amount_CC" FROM 
          (select "GENERATED_PERIOD_START" AS "DT" from "SERIES_GENERATE_DATE"('INTERVAL 1 DAY' ,:FIRSTDATE, :LASTDATE ) ) D 
       CROSS JOIN  ( SELECT DISTINCT "Product" FROM "Example" ) E
       LEFT OUTER JOIN  ( select "DatePayment","Product","Amount" from "Example" ) S
       ON D."DT"=S."DatePayment" AND E."Product"=S."Product";
      
      VAR2= select *  ,  SUM("Amount_CC") OVER (PARTITION BY MONTH("DT"), "Product" ORDER BY "DT"
              ROWS BETWEEN UNBOUNDED PRECEDING  AND CURRENT ROW )  AS "Amount" from :VAR1 ;
      
      select "DT" as "DatePayment","Product","Amount" from :VAR2  where "Amount" <>0 order by "DT","Product";
      
      END;
      

      您将获得数据集中所有月份的结果。 结果如下:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-17
        • 2017-01-16
        • 1970-01-01
        • 1970-01-01
        • 2021-05-15
        相关资源
        最近更新 更多