1

我需要验证是否为表应用了特定规则。

规则 = 链接到 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 个不同的选项(OPTION B 和 OPTION T)链接到 CUSTOMER3

有人可以帮忙吗?

提前非常感谢!

4

3 回答 3

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/whatnot 可能更快)。

如果您实际上只希望返回 CUSTOMER3 并且甚至不关心两个不同的选项,那么它更容易 - 没有排序,假设它已经按 CUSTOMER_NR 排序,如上所述。

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

这不会返回每条记录(具体来说,它不会返回第一个选项),但它会为每个差异返回至少一个记录(它可能返回很多)。

于 2013-04-26T10:57:53.197 回答
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
于 2013-04-26T08:39:06.720 回答
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;

请注意,这将返回与无效配置相关的所有选项,包括第一个。在您的要求中,您似乎想忽略第一个。如果需要,这可以通过后续步骤轻松完成。

于 2013-04-26T22:34:33.863 回答