Reputation: 331
I need to do a JOIN using two ouput-tables (these tables result from previous operations using other tables). I want to give them specific names to reference them. I've try ALIAS, AS, INTO, but nothing works. I am new in SQL and I'd really like some help here. My code is the following
WITH SENDS AS (SELECT "CL" AS Country,
campaign_id AS ID_Campaign,
FORMAT_DATE("%m/%d/%Y",DATE(event_time)) AS Launch_date,
COUNT(campaign_id) AS Sents
FROM `linio-bi.marketing_emarsys_legacy.email_sends_783270611`
WHERE EXTRACT(YEAR FROM DATE(event_time)) >= 2019
GROUP BY ID_Campaign,Launch_date),
BOUNCES AS (SELECT "CL" AS Country,
campaign_id AS ID_Campaign,
FORMAT_DATE("%m/%d/%Y",DATE(event_time)) AS Launch_date,
COUNT(campaign_id) AS Bounces
FROM `linio-bi.marketing_emarsys_legacy.email_bounces_783270611`
WHERE EXTRACT(YEAR FROM DATE(event_time)) >= 2019
GROUP BY ID_Campaign,Launch_date),
OPENS AS (SELECT "CL" AS Country,
campaign_id AS ID_Campaign,
FORMAT_DATE("%m/%d/%Y",DATE(event_time)) AS Launch_date,
COUNT(campaign_id) AS Opens
FROM `linio-bi.marketing_emarsys_legacy.email_opens_783270611`
WHERE EXTRACT(YEAR FROM DATE(event_time)) >= 2019
GROUP BY ID_Campaign,Launch_date),
COMPLAINED AS(SELECT "CL" AS Country,
campaign_id AS ID_Campaign,
FORMAT_DATE("%m/%d/%Y",DATE(event_time)) AS Launch_date,
COUNT(campaign_id) AS Complaints
FROM `linio-bi.marketing_emarsys_legacy.email_complaints_783270611`
WHERE EXTRACT(YEAR FROM DATE(event_time)) >= 2019
GROUP BY ID_Campaign,Launch_date),
UNSUSCRIBED AS (SELECT "CL" AS Country,
campaign_id AS ID_Campaign,
FORMAT_DATE("%m/%d/%Y",DATE(event_time)) AS Launch_date,
COUNT(campaign_id) AS Unsubscribed
FROM `linio-bi.marketing_emarsys_legacy.email_unsubscribes_783270611`
WHERE EXTRACT(YEAR FROM DATE(event_time)) >= 2019
GROUP BY ID_Campaign,Launch_date),
CLICKS AS (SELECT "CL" AS Country,
campaign_id AS ID_Campaign,
FORMAT_DATE("%m/%d/%Y",DATE(event_time)) AS Launch_date,
COUNT(campaign_id) AS Clicks
FROM `linio-bi.marketing_emarsys_legacy.email_clicks_783270611`
WHERE EXTRACT(YEAR FROM DATE(event_time)) >= 2019
GROUP BY ID_Campaign,Launch_date)
-- TABLE 1
SELECT A.Country,
A.ID_Campaign,
A.Launch_date,
IFNULL(A.Sents,0) Sents,
IFNULL(B.Bounces,0) Bounces,
IFNULL(C.Opens, 0) Opens,
IFNULL(D.Complaints,0) Complaints,
IFNULL(E.Unsubscribed,0) Unsubscribed,
IFNULL(F.Clicks,0) Clicks
FROM SENDS A
LEFT JOIN BOUNCES B ON B.ID_Campaign = A.ID_Campaign AND B.Launch_date = A.Launch_date
LEFT JOIN OPENS C ON C.ID_Campaign = A.ID_Campaign AND C.Launch_date = A.Launch_date
LEFT JOIN COMPLAINED D ON C.ID_Campaign = A.ID_Campaign AND D.Launch_date = A.Launch_date
LEFT JOIN UNSUSCRIBED E ON C.ID_Campaign = A.ID_Campaign AND E.Launch_date = A.Launch_date
LEFT JOIN CLICKS F ON C.ID_Campaign = A.ID_Campaign AND F.Launch_date = A.Launch_date
ORDER BY A.ID_Campaign,A.Launch_date;
-- TABLE 2
SELECT "CL" AS Country,
T.campaign_id AS ID_Campaign,
T.name AS Campaign_name,
CONCAT(CAST(T.campaign_id as STRING) ,'-',T.name) full_campaign
FROM(SELECT T.*,
ROW_NUMBER() OVER (PARTITION BY campaign_id ORDER BY event_time DESC) as seqnum
FROM `linio-bi.marketing_emarsys_legacy.email_campaigns_v2_783270611` T
) T
WHERE seqnum = 1
I'd like to make a LEFT JOIN between Table 1 and Table 2 on ID_Campaing, but also I would like to give them names,and of course I'd also want to give a name to the output of this JOIN. Any hints?
Upvotes: 0
Views: 258
Reputation: 562891
You seem so adept with common table expressions, it's puzzling why you haven't taken the final step to make the last two into CTE's:
WITH SENDS AS (...),
BOUNCES AS (...),
OPENS AS (...),
COMPLAINED AS(...),
UNSUSCRIBED AS (...),
CLICKS AS (...),
-- now make two more CTE's:
TABLE1 AS (
SELECT A.Country,
A.ID_Campaign,
A.Launch_date,
IFNULL(A.Sents,0) Sents,
IFNULL(B.Bounces,0) Bounces,
IFNULL(C.Opens, 0) Opens,
IFNULL(D.Complaints,0) Complaints,
IFNULL(E.Unsubscribed,0) Unsubscribed,
IFNULL(F.Clicks,0) Clicks
FROM SENDS A
LEFT JOIN BOUNCES B ON B.ID_Campaign = A.ID_Campaign AND B.Launch_date = A.Launch_date
LEFT JOIN OPENS C ON C.ID_Campaign = A.ID_Campaign AND C.Launch_date = A.Launch_date
LEFT JOIN COMPLAINED D ON C.ID_Campaign = A.ID_Campaign AND D.Launch_date = A.Launch_date
LEFT JOIN UNSUSCRIBED E ON C.ID_Campaign = A.ID_Campaign AND E.Launch_date = A.Launch_date
LEFT JOIN CLICKS F ON C.ID_Campaign = A.ID_Campaign AND F.Launch_date = A.Launch_date
ORDER BY A.ID_Campaign,A.Launch_date
),
TABLE2 AS (
SELECT "CL" AS Country,
T.campaign_id AS ID_Campaign,
T.name AS Campaign_name,
CONCAT(CAST(T.campaign_id as STRING) ,'-',T.name) full_campaign
FROM(SELECT T.*,
ROW_NUMBER() OVER (PARTITION BY campaign_id ORDER BY event_time DESC) as seqnum
FROM `linio-bi.marketing_emarsys_legacy.email_campaigns_v2_783270611` T
) T
WHERE seqnum = 1)
-- and finally join them
SELECT ...
FROM TABLE1 JOIN TABLE2 ON ...
Upvotes: 1