Elbert
Elbert

Reputation: 506

bigquery SQL, aggregate based on quota value

Problem :

SQL :

WITH quota AS (
select 'Product A' as product, 'Quota_batch_1' as quota_id, 10 as quota, '2022-01-01' as batch_date
UNION All
select 'Product A' as product, 'Quota_batch_2' as quota_id, 20 as quota, '2022-02-01' as batch_date
),

purchase as (
  select '2022-01-01' as sales_date, 5 as qty, 'sales_1' as sales_id, 'Product A' as product, 100 as price
  UNION ALL
  select '2022-01-01' as sales_date, 5 as qty, 'sales_2' as sales_id, 'Product A' as product, 150 as price
  UNION ALL
  select '2022-02-03' as sales_date, 2 as qty, 'sales_3' as sales_id, 'Product A' as product, 200 as price
)
select 
quota.*,
sum(qty) as quota_filled_by_qty,
sum(price) as total_price

from quota
left join purchase using (product)
group by 1,2,3,4

Expected result : enter image description here

I have no idea to do the join or the aggregation, as my current result is still aggregated for all result. I've explored like using analytical function, cumulative sum etc but still unable to crack the problem.

Current result : enter image description here

Any idea? thank you

Upvotes: 0

Views: 79

Answers (1)

Damião Martins
Damião Martins

Reputation: 1849

An approach using LEAD navigation function and adjusting your JOIN condition:

WITH quota AS (
select 'Product A' as product, 'Quota_batch_1' as quota_id, 10 as quota, '2022-01-01' as batch_date
UNION All
select 'Product A' as product, 'Quota_batch_2' as quota_id, 20 as quota, '2022-02-01' as batch_date
),
purchase as (
  select '2022-01-01' as sales_date, 5 as qty, 'sales_1' as sales_id, 'Product A' as product, 100 as price
  UNION ALL
  select '2022-01-01' as sales_date, 5 as qty, 'sales_2' as sales_id, 'Product A' as product, 150 as price
  UNION ALL
  select '2022-02-03' as sales_date, 2 as qty, 'sales_3' as sales_id, 'Product A' as product, 200 as price
),
quota_next_batch as (
  SELECT 
    *, 
    LEAD(batch_date) OVER (PARTITION BY product ORDER BY batch_date) as next_batch_date
  FROM quota
)
SELECT 
  q.product,
  q.quota_id,
  q.quota,
  q.batch_date,
  SUM(p.qty) as quota_filled_by_qty,
  SUM(p.price) as total_price
FROM quota_next_batch q 
LEFT JOIN purchase p
  ON p.product = q.product AND p.sales_date >= q.batch_date AND (q.next_batch_date IS NULL OR p.sales_date < q.next_batch_date)
GROUP BY q.product, q.quota_id, q.quota, q.batch_date

Output:

product     quota_id        quota   batch_date  quota_filled_by_qty total_price
Product A   Quota_batch_1   10      2022-01-01  10                  250
Product A   Quota_batch_2   20      2022-02-01  2                   200

Upvotes: 2

Related Questions