我有一个查询,该查询产生两个单独的ID:
SELECT
date,
user_id,
vendor_id,
SUM(purchase) user_purchase
SUM(spend) vendor_spend
GROUP BY 1,2,3
FROM tabla.abc
这会产生如下结果:
date user_id vendor_id user_purchase vendor_spend
1/1/18 123 NULL 5.00 0.00
1/1/18 NULL 456 0.00 10.00
我想将其连接到一个看起来像这样的表上:
client_id user_id vendor_id
456789 123 NULL
101112 NULL 456
但是问题是,我显然希望将其加入两个适当的ID中,以便最终输出看起来像这样:
date client_id user_id vendor_id user_purchase vendor_spend
1/1/18 456790 123 NULL 5.00 0.00
1/1/18 101112 NULL 456 0.00 10.00
那么有没有办法我可以做,有条件的加入?像WHERE user_id IS NULL THEN...
之类的东西
答案 0 :(得分:1)
使用SQLfiddle,因为其中一个参数可能为null:
select *
from (
select
date,
user_id,
vendor_id,
sum(purchase) user_purchase,
sum(spend) vendor_spend
from table1
group by 1,2,3
) t1
join table2 t2
on (t1.user_id, t1.vendor_id)
is not distinct from (t2.user_id, t2.vendor_id)
请注意,出于性能原因,您应该加入已经聚合的表(因此,我已将原始查询放置在派生表中)。
答案 1 :(得分:0)
尝试一下:
SELECT
date,
COALESCE(lu.client_id, lv.client_id) AS client_id,
user_id,
vendor_id,
SUM(purchase) user_purchase
SUM(spend) vendor_spend
FROM tabla.abc
LEFT JOIN tabla.link AS lu USING (user_id)
LEFT JOIN tabla.link AS lv USING (vendor_id)
GROUP BY 1,2,3,4
答案 2 :(得分:0)
我认为足够的联接就是这样:
FROM aggregated_table t1
LEFT JOIN client_id_table t2
ON t1.user_id=t2.user_id
OR t1.vendor_id=t2.vendor_id
因为据我了解,如果有用户ID,则需要按用户ID加入;如果有供应商ID,则应按供应商ID加入。将左连接与OR配合使用完全可以做到这一点。
此外,条件连接也是可能的。如果您熟悉CASE
语句,则在联接条件下可以很好地工作。类似的事情可以表示为:
FROM aggregated_table t1
LEFT JOIN client_id_table t2
ON CASE
WHEN t1.user_id is not null THEN t1.user_id=t2.user_id
WHEN t1.vendor_id is not null THEN t1.vendor_id=t2.vendor_id
END
但是与以前的选项相比,这太冗长了,我认为应该产生相同的结果