我希望跨行创建一个指标,以查看公司是否销售苹果。例如,给定一个数据帧:
Company | Product | Salesperson
A Apple John
A Banana John
A Orange Jane
B Orange John
B Banana Sam
我想创建一个 dummyvar 列,用 1 标记所有公司 A,因为约翰在那里卖苹果
Company | Product | Salesperson | IND
A Apple John 1
A Banana John 1
A Orange Jane 1
B Orange John 0
我想在 sas 或 SQL 中执行此操作。
这在 PROC SQL 中很容易做到,因为 SAS 会自动将详细信息行与摘要统计信息重新合并。 布尔表达式的计算结果为 0/1,因此只需使用 MAX() 来确定表达式是否为真。
proc sql ;
create table want as
select *,max(product='Apple') as IND
from have
group by company
;
quit;
MS SQL Server:解决方案可能是这样的:
declare @tbl as table (
company varchar(1)
,product varchar(10)
,salesPerson varchar(10)
)
insert into @tbl values ('A', 'Apple', 'John')
insert into @tbl values ('A', 'Banana', 'John')
insert into @tbl values ('A', 'Orange', 'Jane')
insert into @tbl values ('B', 'Orange', 'John')
insert into @tbl values ('B', 'Banana', 'Sam')
SELECT
company
,product
,salesPerson
,CASE WHEN
company IN (SELECT company FROM @tbl WHERE product = 'Apple' AND salesPerson = 'John') THEN 1
ELSE 0
END AS col
FROM @tbl
假设表的名称为 X,并且 IND 列已经存在空值。
update X
SET IND = 1
WHERE Company IN (select distinct(Company) from X where Product = 'Apple' AND Salesperson = 'John')
update X
SET IND = 0
WHERE Company NOT IN (select distinct(Company) from X where Product = 'Apple' AND Salesperson = 'John')