2017-11-01 8 views
-1

私は、行間にインジケータを作成して、ある企業がリンゴを販売しているかどうかを調べたいと考えています。例えば、データフレームを与えられた:行間にインジケータを作成する

Company | Product | Salesperson  
A   Apple  John 
A   Banana  John 
A   Orange  Jane 
B   Orange  John 
B   Banana  Sam 

ジョンが

Company | Product | Salesperson | IND 
A   Apple  John    1 
A   Banana  John    1 
A   Orange  Jane    1 
B   Orange  John    0 

私はこれでをしたいと思っりんごを販売しているので、私は1とA社のすべてをマークするdummyvar列を作成したいですsasまたはSQL。

+0

結果セットから1行を削除したのはなぜですか? – Tom

答えて

0

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 
0

名で既にNULL値で存在する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') 
4

SASは自動的に統計情報の詳細行を再作成するため、PROC SQLで簡単に実行できます。ブール式は0/1と評価されますので、式が真であるかどうかを調べるためにMAX()をとります。

proc sql ; 
create table want as 
    select *,max(product='Apple') as IND 
    from have 
    group by company 
; 
quit; 
+0

ありがとう@トム!しかし、ダミー変数も作成したかったのです。私がやったのは テーブル作成apple_tableを から選択してくださいproduct = 'Apple' その後、元のデータに戻って元のデータに戻ってきました。 Aのすべてが1を持ち、Bがそうでない。 (私は後でマルチプルの列でこれをやっています。なぜならジョンがまだリンゴを売っていれば、彼がBの仕事をしていれば会社に渡ってジョンを訪ねたいからです。 – ASavage

+0

@ASavageこのコメントであなたが何を求めているのかよくわかりません。この答えでは、すべてのデータが選択され、真または偽のどちらかでINDという名前の新しいデータが1つ追加されます(COMPANYのグループ化により、新しい列の値はCOMPANYの同じ値の定数になります)。 – Tom

+0

IfリンゴがJohnによって販売され、次にその条件をMAX()集約関数内の論理式に追加する必要があります。 – Tom

関連する問題