-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathunattributed_revenue.sql
More file actions
92 lines (89 loc) · 1.81 KB
/
Copy pathunattributed_revenue.sql
File metadata and controls
92 lines (89 loc) · 1.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
WITH session_order_match AS (
SELECT
o.order_id,
o.customer_id,
o.order_date,
o.revenue,
s.session_id,
s.campaign_id,
s.date AS session_date,
ROW_NUMBER() OVER (
PARTITION BY o.order_id
ORDER BY s.date DESC
) AS rn
FROM orders o
JOIN web_sessions s
ON o.customer_id = s.customer_id
AND s.date <= o.order_date
),
attributed_orders AS (
SELECT order_id, campaign_id, order_date, revenue
FROM session_order_match
WHERE rn = 1
),
revenue_by_channel AS (
SELECT
c.channel,
SUM(ao.revenue) AS total_revenue
FROM attributed_orders ao
JOIN campaigns c
ON ao.campaign_id = c.campaign_id
GROUP BY c.channel
),
spend_by_channel AS (
SELECT
c.channel,
SUM(sp.spend) AS total_spend
FROM ad_spend_daily sp
JOIN campaigns c
ON sp.campaign_id = c.campaign_id
GROUP BY c.channel
)
SELECT
r.channel,
r.total_revenue,
s.total_spend,
CASE
WHEN s.total_spend = 0 THEN NULL
ELSE r.total_revenue * 1.0 / s.total_spend
END AS roas
FROM revenue_by_channel r
LEFT JOIN spend_by_channel s
ON r.channel = s.channel
UNION ALL
-- Add unattributed
SELECT
'Unattributed' AS channel,
SUM(o.revenue) AS total_revenue,
0 AS total_spend,
NULL AS roas
FROM orders o
LEFT JOIN attributed_orders ao
ON o.order_id = ao.order_id
WHERE ao.order_id IS NULL;
-- Attributed revenue total
WITH session_order_match AS (
SELECT
o.order_id,
o.customer_id,
o.order_date,
o.revenue,
s.session_id,
s.campaign_id,
s.date AS session_date,
ROW_NUMBER() OVER (
PARTITION BY o.order_id
ORDER BY s.date DESC
) AS rn
FROM orders o
JOIN web_sessions s
ON o.customer_id = s.customer_id
AND s.date <= o.order_date
),
attributed_orders AS (
SELECT order_id, campaign_id, order_date, revenue
FROM session_order_match
WHERE rn = 1
)
SELECT ROUND(SUM(revenue),2) AS attributed_revenue
FROM attributed_orders;