2017-04-11 42 views
1

我有一個表跟蹤數據。在其他值中,該表具有traffic_medium,traffic_source和traffic_campaign兩列。這些列有時包含(none)或null作爲值。左加入多個條件,部分爲空或空

我想匹配來自其他表格的訪問者的總和,使用左連接與中等,scource和廣告系列作爲匹配條件。

如果所有的列都包含數據,這可以正常工作。如果一列有(無)或null作爲值,它不起作用。

我使用BigQuery和傳統SQL。

SELECT 
A.id, 
A.trafficSource_medium, 
A.trafficSource_source, 
A.trafficSource_campaign, 
B.sum_visitor AS sum_visitor 

FROM [table] AS A 
left outer join (Select 
count(distinct fullvisitorID) as sum_visitor, 
trafficSource_medium, 
trafficSource_source, 
trafficSource_campaign 
FROM [table2] 
GROUP BY trafficSource_medium, 
trafficSource_source, 
trafficSource_campaign) 
AS B 
on A.trafficSource_medium=B.trafficSource_medium AND  
A.trafficSource_source=B.trafficSource_source AND 
A.trafficSource_campaign=B.trafficSource_campaign 

感謝您的幫助!

回答

0

嘗試類似下面的操作
假設各個字段爲STRING類型。如果他們INT - 替換「N/A」與假設-999 - 重要的是選擇常量,它不是作爲各自領域的價值在這裏

#legacySQL 
SELECT 
    A.id, 
    CASE WHEN A.trafficSource_medium = 'n/a' THEN NULL ELSE A.trafficSource_medium END AS trafficSource_medium, 
    CASE WHEN A.trafficSource_source = 'n/a' THEN NULL ELSE A.trafficSource_source END AS trafficSource_source, 
    CASE WHEN A.trafficSource_campaign = 'n/a' THEN NULL ELSE A.trafficSource_campaign END AS trafficSource_campaign, 
    B.sum_visitor AS sum_visitor 
FROM (
    SELECT 
    id, 
    IFNULL(trafficSource_medium, 'n/a') AS trafficSource_medium, 
    IFNULL(trafficSource_source, 'n/a') AS trafficSource_source, 
    IFNULL(trafficSource_campaign 'n/a') AS trafficSource_campaign 
    FROM [table] 
) AS A 
LEFT OUTER JOIN (
    SELECT 
    COUNT(DISTINCT fullvisitorID) AS sum_visitor, 
    IFNULL(trafficSource_medium, 'n/a') AS trafficSource_medium, 
    IFNULL(trafficSource_source, 'n/a') AS trafficSource_source, 
    IFNULL(trafficSource_campaign 'n/a') AS trafficSource_campaign 
    FROM [table2] 
    GROUP BY 
    trafficSource_medium, 
    trafficSource_source, 
    trafficSource_campaign 
) AS B 
ON A.trafficSource_medium = B.trafficSource_medium 
AND A.trafficSource_source = B.trafficSource_source 
AND A.trafficSource_campaign = B.trafficSource_campaign 

想法是「改造」空值一些值,因此它們可以JOIN'able - 然後在最後SELECT變爲NULL返回NULL

如果您可以遷移到標準SQL - 您可以嘗試下面的代碼 - 它所做的更改較少 - 主要在ON子句中

#standardSQL 
SELECT 
    A.id, 
    A.trafficSource_medium, 
    A.trafficSource_source, 
    A.trafficSource_campaign, 
    B.sum_visitor AS sum_visitor 
FROM `table` AS A 
LEFT OUTER JOIN (
    SELECT 
    COUNT(DISTINCT fullvisitorID) AS sum_visitor, 
    trafficSource_medium, 
    trafficSource_source, 
    trafficSource_campaign 
    FROM `table2` 
    GROUP BY 
    trafficSource_medium, 
    trafficSource_source, 
    trafficSource_campaign 
) AS B 
ON IFNULL(A.trafficSource_medium, 'n/a') = IFNULL(B.trafficSource_medium, 'n/a') 
AND IFNULL(A.trafficSource_source, 'n/a') = IFNULL(B.trafficSource_source, 'n/a') 
AND IFNULL(A.trafficSource_campaign, 'n/a') = IFNULL(B.trafficSource_campaign, 'n/a')