2013-04-26 38 views
1

我需要驗證特定規則是否應用於表。如何驗證列B中的值組與列A中的值的比較

連接到1個客戶(CUSTOMER_NR)規則=所有選項(列OPTION_REF)應該是相同的

(注:客戶可以有1到800的選項鍊接,所以只是鏈接表本身是不適用)

我需要檢測不是所有鏈接的選項都相同的客戶。

CUSTOMER_NR CONTRACT_NR OPTION_REF 
------------------------------------- 
CUSTOMER1 CONTRACT1 OPTION A 
CUSTOMER1 CONTRACT2 OPTION A 
CUSTOMER1 CONTRACT3 OPTION A 
CUSTOMER2 CONTRACT1 OPTION F 
CUSTOMER2 CONTRACT2 OPTION F 
CUSTOMER3 CONTRACT1 OPTION B 
CUSTOMER3 CONTRACT2 OPTION T 
CUSTOMER3 CONTRACT3 OPTION B 

在上面,我需要找回 'CUSTOMER3' 作爲我的查詢的結果,例如,2個不同的選項(選項B & OPTION T)鏈接到CUSTOMER3

有人能幫忙嗎?

非常感謝!

回答

2

嘗試這樣的:

declare @data as table (customer varchar(50), cont varchar(50), opt varchar(50)) 
insert into @data values 
('CUSTOMER1', 'CONTRACT1', 'OPTION A'), 
('CUSTOMER1', 'CONTRACT2', 'OPTION A'), 
('CUSTOMER1', 'CONTRACT3', 'OPTION A'), 
('CUSTOMER2', 'CONTRACT1', 'OPTION F'), 
('CUSTOMER2', 'CONTRACT2', 'OPTION F'), 
('CUSTOMER3', 'CONTRACT1', 'OPTION B'), 
('CUSTOMER3', 'CONTRACT2', 'OPTION T'), 
('CUSTOMER3', 'CONTRACT3', 'OPTION B') 


select agregatedData.customer 
from(
    select customer,opt 
    from @data 
    group by customer,opt 
) as agregatedData 
group by agregatedData.customer 
having COUNT(0) > 1 
2

SAS解決方案:

proc sort data=have out=sorted nodupkey; 
by customer_nr option_ref; 
run; 

data want; 
set sorted; 
by customer_nr option_ref; 
if not (first.customer_nr and last.customer_nr); 
run; 

也可以用PROC FREQ或任何聚集,但因爲你不關心每計數排序是一樣簡單除非它是一個非常龐大的數據集(在這種情況下,PROC FREQ/MEANS /不會更快)。

如果你實際上只想要CUSTOMER3返回,甚至不關心兩個不同的選項,那麼它更容易 - 沒有排序,假設它已經按照上面的CUSTOMER_NR排序。

data want; 
set have; 
by customer_nr option_ref notsorted; 
if first.option_ref and not first.customer_nr; 
run; 

這將不會返回每個記錄(它不會返回第一個選項,特別是),但它會返回至少一個記錄每個差異(它可能會返回很多)。

0

SAS SQL版本:

data mydata; 
    input customer $ 
     contract $ 
     option $20. 
     ; 
datalines; 
CUSTOMER1 CONTRACT1 OPTION A 
CUSTOMER1 CONTRACT2 OPTION A 
CUSTOMER1 CONTRACT3 OPTION A 
CUSTOMER2 CONTRACT1 OPTION F 
CUSTOMER2 CONTRACT2 OPTION F 
CUSTOMER3 CONTRACT1 OPTION B 
CUSTOMER3 CONTRACT2 OPTION T 
CUSTOMER3 CONTRACT3 OPTION B 
; 
run; 


** 
** SUMMARY OF INVALID CUSTOMERS 
*; 
proc sql noprint; 
    create table validation_summary as 
    select customer, 
     count(distinct option) as number_unique_options 
    from mydata 
    group by 1 
    having count(distinct option) > 1 
    ; 
quit; 

** 
** DETAILS OF INVALID CUSTOMERS 
*; 
proc sql noprint; 
    create table validation_detail as 
    select distinct a.customer, a.option 
    from mydata a 
    where a.customer in (select b.customer 
         from mydata b 
         group by 1 
         having count(distinct option) > 1 
        ) 
    ; 
quit; 

注意這將返回所有與無效的配置,其中包括第一個相關的選項。在你的要求中,它看起來像你想忽略第一個。如果需要,這可以通過後續步驟輕鬆完成。

相關問題