T-SQL无法获取CASE语句只选择一个替代

时间:2015-12-30 23:03:33

标签: sql tsql case

在我们的系统中,每个客户都有一个称呼(0),有些还有另外一个称呼(22)。我需要做的是让那些没有22的人默认为0。我试图用一个案例陈述来完成这个:

select distinct a.customer_no,
case when b.sal_code = '22' then '22' 
    when b.sal_code <> '22' then '0'
    else '0'
end as salutation_no
from t_customer a
    join t_sal b
on a.customer_no = b.customer_no    
where a.customer_no in (1734379, 120706)

然而,对于那些不支持22和0的客户而言,我得到的不是22,而是所有客户都得到0,而对于那些拥有该客户的人则得到22;

customer_no salutation_no
120706       0
120706       22
1734379      0

3 个答案:

答案 0 :(得分:3)

你得到双重记录,因为有些客户有2个称呼,加入的结果是那些双重记录。

您可以使用此查询获取一条记录。它使用max函数,因为您希望22覆盖0。

select a.customer_no,
    max(sal_code) as salutation_no
from t_customer a
    join t_sal b
on a.customer_no = b.customer_no    
where a.customer_no in (1734379, 120706)
group by a.customer_no

答案 1 :(得分:1)

仅在类型为'22'时加入称呼,其他所有人现在null都有sal_code。使用coalescenull默认为'0'

select C.customer_no
    , coalesce(S.sal_code, '0') as salutation_no
from t_customer C
left join t_sal S
    on S.customer_no = C.customer_no
    and S.sal_code = '22'
where S.customer_no in (1734379, 120706)
  1. 如果您需要distinct,则不清楚数据模型。
  2. 这将包含t_customer行,t_sal中没有可在您的查询中过滤掉的行。在不知道数据的情况下,我并非100%确定这是一个合适的解决方案。

答案 2 :(得分:0)

避免重复的另一种方法是使用union all

select s.customer_no, '22' as sal_code
from t_sal s
where s.sal_code = '22'
union all
select c.customer_no, '0'
from t_customer c
where not exists (select 1 from t_sal s where s.customer_no = c.customer_no and s.sal_code = '22');

这应该比使用group byselect distinct的任何查询都快。