跨Z_KSS与Z_KSS2两表统计Distinct MEM_ID:是否用全外连接及On条件?
嘿,我来帮你搞定这个SQL统计的问题~
问题解答
1. 是否应该使用FULL OUTER JOIN?
可以用,但得分场景选择更合适的方式:
- 如果只需要统计去重的MEM_ID数量,用
UNION会更简洁高效——它会自动帮你去除重复的MEM_ID,不需要做复杂的关联操作。 - 如果还要同时统计金额总和,那FULL OUTER JOIN是合适的,因为它能把两张表的所有记录都包含进来,方便合并同一MEM_ID在两张表中的金额。
2. 是否需要指定ON条件?
必须要! 要是不加ON条件,FULL OUTER JOIN会生成两张表的笛卡尔积(所有记录两两配对),这完全不符合你的统计需求。你得加上ON Z_KSS.MEM_ID = Z_KSS2.MEM_ID,这样才能把两张表中相同的MEM_ID关联起来,准确识别出重复的会员ID,避免重复计数。
实用SQL方案推荐
方案一:仅统计去重MEM_ID数量(简单直接)
如果只需要会员数,用这个就够了:
SELECT COUNT(DISTINCT MEM_ID) AS unique_mem_count, 'KSS' AS Company FROM ( SELECT MEM_ID FROM temp_09.Z_KSS UNION -- UNION自动去重,同一MEM_ID仅保留一条 SELECT MEM_ID FROM temp_09.Z_KSS2 ) AS combined_mems
方案二:同时统计会员数和总金额(用FULL OUTER JOIN)
如果要一起计算金额,得处理NULL值(比如某个MEM_ID只在一张表存在时,另一张表的Amount会是NULL),用COALESCE把NULL转成0就能避免求和出错:
SELECT COUNT(DISTINCT COALESCE(z1.MEM_ID, z2.MEM_ID)) AS unique_mem_count, SUM(COALESCE(z1.Amount, 0) + COALESCE(z2.Amount, 0)) AS total_amount, 'KSS' AS Company FROM temp_09.Z_KSS z1 FULL OUTER JOIN temp_09.Z_KSS2 z2 ON z1.MEM_ID = z2.MEM_ID
提个醒:你原来的SQL缺少ON条件,而且直接
sum(Amount)没有区分两张表的字段,这样肯定会计算错误,一定要补上ON条件并正确处理金额字段哦~
内容的提问来源于stack exchange,提问作者ZJAY
相关产品推荐
相关产品推荐

