2015-12-30 42 views
1

在我們的系統中,每個客戶都有一個稱呼(0),有些人還有另外的稱呼(22)。我需要做的是將沒有22的默認值改爲0。我想利用這個case語句來實現:T-SQL無法獲得CASE語句僅選擇一個替代方案

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,爲客戶提供22S和0對於那些不這樣做的,我得到的所有客戶0,併爲那些額外的22誰也有:

customer_no salutation_no 
120706  0 
120706  22 
1734379  0 
+0

我認爲T-SQL的不等於運算符是「!=」請參閱此[post](https://msdn.microsoft.com/en-us/library/ms190296.aspx) – vmachan

+1

錯誤<>很好在TSQL中,但你也可以使用!=(我更喜歡<>) –

+0

DISTINCT不僅僅是一列,它適用於所有選定的列。如果有兩個具有不同'b'值的'a'值,'SELECT DISTINCT a,b'會給出兩行。請參閱@Szymon的解決方案,它應該適合您。 – EvilBob22

回答

3

您得到雙記錄,因爲有一些客戶有兩種稱呼,而加入的結果是那些雙記錄。

您可以使用此查詢獲取一條記錄。它採用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

加入到稱呼,只有當它是類型'22',所有其他人現在有nullsal_code。使用​​3210默認爲null'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%確定這是一個合適的解決方案。
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任何查詢速度更快。