SAS每年的变量计数和其他每个变量

时间:2016-11-18 09:25:40

标签: sql sas

我没有像我期望的那样得到结果。

这是我的数据集:

data have0;
 infile cards truncover expandtabs;
 input MC $ ET $ Date :date9. Time :time. PMC $ PXMC $ Site $ Dia MV SF;
 format date date8. Time HHMM.;
 cards;
US000409 Meas 12Oct2015 17:26 7101 Et1 1 . 2780462.00000 1
US000409 Meas 12Nov2016 17:33 7101 Et1 1 861.26 2780462.00000 1
US000409 Lath 12Oct2015 17:33 7102 Et1 1 861.6 2780462.00000 1
US01036 Meas 12Nov2016 17:26 7101 Et1 2 . 522860.00000 1
US01036 Lath 13Oct2016 17:33 7202 Et1 2 866.68 522860.00000 1
US01036 Meas 13Oct2015 17:33 7101 Et1 2 867.36 522860.00000 1
US02044 Meas 13Nov2016 17:26 7202 Et1 1 . 569298.00000 1
US02044 Lath 13Nov2015 17:33 7202 Et1 1 865.32 569298.00000 1
US02044 Meas 14Nov2016 17:33 7202 Et1 2 865.68 569298.00000 1
US318 Lath 14Nov2016 17:26 7101 Et2 2 . 2630856.00000 1
US318 Meas 14Nov2016 17:33 7202 Et2 3 863.26 2630856.00000 1
US318 Lath 14Nov2016 17:33 7202 Et2 3 863.94 2630856.00000 1
US000409 Meas 15Nov2016 21:56 7202 Et2 3 860.98 2780462.00000 1
US000409 Meas 15Nov2016 21:56 7203 Et2 4 861.5 2780462.00000 1
US01036 Lath 16Nov2016 21:56 7101 Et2 4 866.64 522860.00000 1
US01036 Meas 16Nov2016 21:56 7202 Et2 4 867.34 522860.00000 1
US02044 Lath 17Nov2016 21:56 7203 Et2 1 865.3 569298.00000 1
US02044 Meas 17Nov2016 21:56 7204 Et2 3 865.68 569298.00000 1
US318 Lath 17Nov2016 21:56 7204 Et2 2 863.24 2630856.00000 1
;
run;

我想做的是:

PROC SQL;
   CREATE TABLE MC_ET AS 
   SELECT t1.MC, 
            case t1.ET 
                when "Lath" then (COUNT(t1.ET)) AS COUNT_of_ET_Lath
                when "Meas" then (COUNT(t1.ET)) AS COUNT_of_ET_Meas
            end, 
            (year(t1.Date)) AS Year
      FROM have0 t1
      GROUP BY t1.MC, (CALCULATED Year);
QUIT;

我期待得到像这样的结果:

MC  Year    Count_Lath  Count_Meas
US000409    2015    1   1
US000409    2016    1   3
US01036 2015    0   1
US01036 2016    2   2
US02044 2015    1   0
US02044 2016    1   3
US318   2016    3   1

我不知道如何在上面的代码中使用case。我想我犯了一些错误。请帮忙纠正。

感谢。

2 个答案:

答案 0 :(得分:1)

我在你的解释中有点迷失,但是,如果你想做两个这样的计数,你需要在不同的列中进行。在SQL案例中,它作为一个开关,它的输出总是只有一列。

但是我不使用SAS,我使用Oracle,所以请谨慎行事。在Oracle中,字符串是用撇号而不是引号来捕获的,也许你也是如此。

我建议尝试这个而不是你的情况:

sum(case when t1.ET='Lath' then 1 else 0 end) as count_lath,
sum(case when t1.ET='Meas' then 1 else 0 end) as count_meas

你的分组应该没问题。

试试这个,希望它有所帮助。

答案 1 :(得分:0)

是的,我明白了......谢谢@Emil ......

PROC SQL;
   CREATE TABLE MC_ET AS 
   SELECT t1.MC, (year(t1.Date)) AS Year,
                sum(case when t1.ET='Lath' then 1 else 0 end) as Count_of_Lath,
                sum(case when t1.ET='Meas' then 1 else 0 end) as count_of_Meas
      FROM have t1
      GROUP BY t1.MC, (CALCULATED Year)
;
QUIT;