data _null_;
    call symputx("exe_dt",strip(put(today(),yymmdds10.)));
run;

%inc ".\libname.sas";

options formdlim='=' ls=148 ps=50 ls=100 ps=73 spool;
%let end_col=14;

data dmy;
id=1;id2=1;id3=1;output;
id1=2;id2=1;id3=1;output;
id1=2;id2=2;id3=9;output;
id1=2;id2=3;id3=9;output;
run;

%macro summary(shtnm,where1,where2,tran_id);

proc sort dat=libm.ADSL out=ADSL;by SUBJID;run;

data ADSL_wk01;
    length INC0 $200.;
    set ADSL;
    if INC02A=1 then INC0_1="A";
    else if INC02A=1 then INC0="B";
    if SUBGR1P=1 then SUBGRP_1="A";
    else if SUBGRP1=0 then SUBGRP_1="B";
    if SUBGRP2=1 then SUBGRP_1="A";
    else if SUBGRP2=0 then SUBGRP_2="B";
run;

%macro keta_max(var);
%global keta_max;
proc sql;
select max(keta)
into:keta_max
from
(select
case when kindex(strip(put(&var.,best.)),".")=0 then 0
else klength(strip(put(&var.,best.)))-kindex(strip(put(&var.,best.)),".") end as keta
,count(&var.)
from adsl
group by keta
)
;
quit;
%mend;


%let _COL0_1=0;
%let _col0_2=0;

proc sql noprint;select count(distinct(SUBJID)) into:_COL0_1 trimmed from ADSL_2A;quit;
proc sql noprint;select count(distinct(SUBJID)) into:_COL0_1 trimmed from ADSL_2A;quit;

%macro summary_means(id1,var,tests_types);
    *-----------;
    proc sql noprint;
        create table a as 
        select * from ADSL_2A;
        quit;
        %if &sqlobs.>1 %then %do;
            %if &_COL0_1.^=0 %then %do;
                proc means data=ADSL_2A noprint;
                    var &var;
                    output out=means
                    n=n mean=mean std=std min=min mediann=med max=max;
                run;
            %end;
        %end;
        %else %do;
            data means;
                _type=.;_freq_=.;n=.;mean=.;std=.;min=.;med=.;max=.;
                if _n_=0;
            run;
        %end;
        
        data means_ADSL_2A_&id1.;
            set means;
            id1=&id1.;
            id2=_n_;
        run;
        data means_ADSL_2A_&id1.;
            merge
            dmy(where=(id1=&id1.))
            means_ADSL_2A_&id1.;
            by ID1 ID2;
        run;
    *-----------;
    proc sql noprint;
        create table a as 
        select * from ADSL_2B;
        quit;
        %if &sqlobs.>1 %then %do;
            %if &_COL0_2.^=0 %then %do;
                proc means data=ADSL_2A noprint;
                    var &var;
                    output out=means
                    n=n mean=mean std=std min=min mediann=med max=max;
                run;
            %end;
        %end;
        %else %do;
            data means;
                _type=.;_freq_=.;n=.;mean=.;std=.;min=.;med=.;max=.;
                if _n_=0;
            run;
        %end;
        
        data means_ADSL_2B_&id1.;
            set means;
            id1=&id1.;
            id2=_n_;
        run;
        data means_ADSL_2B_&id1.;
            merge
            dmy(where=(id1=&id1.))
            means_ADSL_2B_&id1.;
            by ID1 ID2;
        run;
    *-----------;
    %if &sqlobs.<1 %then %do;
        ODS Graphics on;
        ods noresults;
        ods listing close;
        proc ttest data=ADSL_2k01(where=(&where1. or &where2.)) plots=none;
            class &tran_id.;
            var &var;
            ods output ttests=TTEST(where=(method="Pooled"));
        run;
        ods listing;
        ods results;
        quit;
    %end;
    %else %do;
        data %test;
            variabe="";method="";variances="";tlalue=.;DF=.;Probt=.;
        run;
    %end;
    
    data TTEST_&id1..;
    set TTEST;
    id1=&id1.;
run;
%keta_max(var=&var.);
data res_&id1.;
    length _COL1-_COL&end_col $200.;
    merge 
        dmyin=x where=(id1=&ID1.))
        means_ADSL_2A_&ID1.
        means_ADSL_2B_&ID1.(rename=(n=n2 means=mean2 std std2 min=min2 med=med2 max=ma2))
        TTEST_&ID1.
        ;
        by ID1;
        if n ne . then _COL1=strip(put(n,8.));
        else _COL1="0";
        if mean ne . then _COL2=strip(put(round(mean,0.1**%eval(1+keata_max.)),8.%eval(1+keta_max.)));
        else _COL2="-";
        if mean ne . then _COL3=strip(put(round(std,0.1**%eval(2+keata_max.)),8.%eval(2+keta_max.)));
        else _COL3="-";
        if mean ne . then _COL4=strip(put(round(min,0.1**%eval(keata_max.)),8.%eval(keta_max.)));
        else _COL4="-";
        if mean ne . then _COL5=strip(put(round(med,0.1**%eval(1+keata_max.)),8.%eval(1+keta_max.)));
        else _COL5="-";
        if mean ne . then _COL6=strip(put(round(max,0.1**%eval(keata_max.)),8.%eval(keta_max.)));
        else _COL6="-";
        if n ne . then _COL7=strip(put(n2,8.));
        else _COL7="0";
        if mean ne . then _COL8=strip(put(round(mean2,0.1**%eval(1+keata_max.)),8.%eval(1+keta_max.)));
        else _COL8="-";
        if mean ne . then _COL9=strip(put(round(std2,0.1**%eval(2+keata_max.)),8.%eval(2+keta_max.)));
        else _COL9="-";
        if mean ne . then _COL10=strip(put(round(min2,0.1**%eval(keata_max.)),8.%eval(keta_max.)));
        else _COL10="-";
        if mean ne . then _COL11=strip(put(round(med2,0.1**%eval(1+keata_max.)),8.%eval(1+keta_max.)));
        else _COL11="-";
        if mean ne . then _COL12=strip(put(round(max2,0.1**%eval(keata_max.)),8.%eval(keta_max.)));
        else _COL12="-";
        if _n_=1 then _COL13="&tests_types.";if Probt ne . then _COL14=strip(put(Probt,pvalue6.3));
        else _COL14="-";
    run;
    keep ID1 ID2 _COL:;
%mend;        
%macro summary_freq(id1,var,test_type);
    %let sqlobs=0;
    proc sql noprint;
        create table a as
        select &tran_id,count(*) from ADSL_wk01(where=(&where1. or &where2.)) group by &tran_id having count(*)>>0
    ;
    quit;
    %if &sqlobs.>1 %theen %do;
        ods output fishersExact=fisher(where=(name1="XP2_FISH"));
        proc freq data=ADSL_wk01;
            tables &var.*&tran_id/chisq exact;
            output out=freq_chi chisq exact;
        run;
        data fisher;
            set fisher;
        run;
    %end;
    %else %do;
        data fisher;
            mane1="XP2_FISH";nvalue1=.;output;
        run;
    %end;
    prod freq data=ADSL_wk01;
        tables &var.*tran_id/ nocol nopercent output=freq_cnt;
        where &tran_id ne "";
    run;
    
    proc transpose data=freq_cnt(where=(&tran_id. ne "")) out=freq_cnt_tran prefix=C_;
    ID &tran_id.;
    var COUNT;
    by &var.;
    run;
    data freq_fisher_tran;
        merge 
        Freq_cnt_tran fisher(rename=nValue1=Pr);
        ID1=&id1.;
        ID2=1;
        run;
    data Freq_&ID1.;
        length C_A C_B 8.;
        set Freq_fisher_tran;
        if C_A=. then C_A=0;
        if C_B. then C_B=0;
        ID1=&ID1.;
        ID2=_n_;
    run;
    data rew_&id1.;
        length _COL1=COL14 $200.;
        merge
        dmy(in=x where=(ID1=&ID1.))
        Freq_&id1.
        ;
        by ID1 ID2;
        if x;
        
        if C_A=0 and &_COL0_1=0 then _COL1="=";
        else if &_COL0_1 ne 0 then _COL1=cats(put(C_A,8.)),"(",put(round(C_A/&_COL0_1*100,0.1),8.1),!$!);
        _COL2="-";
        _COL3="-";
        _COL4="-";
        _COL5="-";
        _COL6="-";
        if C_B=0 and &_COL0_3= 0 then _COL1="=";
        else if &_COL0_1 ne 0 then _COL1=cats(put(C_BB,8.)),"(",put(round(C_B/&_COL0_1*100,0.1),8.1),!$!);
        _COL8="-";
        _COL9="-";
        _COL10="-";
        _COL11="-";
        _COL12="-";        
        if _n_1 then do;
            _COL13="&tests_types.";
            if Pr=. then _COL14="-";
            else _COL14=strip(put(Pr,pvalue6.3));
        end;
        keep ID1 ID2 _COL:;
    run;    
%mend;

%summary_means(id1=1,var=AGE,test_types=%str(t検定));
%summary_freq(id1=2,var=AGE_,test_types=%str(Fisher));

data &shtnm.;
set res:(keep=_COL: ID:);
run;
proc datasets;
delete res:;
run;
quit;

%mend;
%summary(shtnm=T2,where1=%str(INC02A=1),where2=%str(INC02B=1),tran_id=inc0);
%summary(shtnm=T2_1,where1=%str(SUBGRP1=1),where2=%str(SUBGRP1=0),tran_id=SUBGRP_1);
%summary(shtnm=T2_1,where1=%str(SUBGRP2=1),where2=%str(SUBGRP2=0),tran_id=SUBGRP_2);