嘗試類似下面的操作
假設各個字段爲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')