【问题标题】:Count where the value is not missing计数不缺少值的位置
【发布时间】:2013-01-23 05:06:26
【问题描述】:

我想计算没有缺失值的列中日期的出现次数。因此,例如,我想计算汽车服务的次数,而不是包括没有服务日期的空值。

我尝试了简单的计数功能,但它带来了所有记录。我想过使用“案例”,但我不确定语法。我正在使用 SAS 企业指南。

采样日期

id    car     service_Date
1     honda   01/01/2005
2     honda   01/01/2006
3     honda   
4     honda   01/01/2008
5     honda   
6     honda   01/01/2010

结果:我只想有 4 个作为答案,所以它不计算空值。

PROC SQL;
CREATE TABLE WORK.QUERY_FOR_CARS AS 
SELECT 
t1.CAR,
t1.ID  
/* SERVICE_DATE */
(count (case when t1.S_DATE is not null then 0 end)) AS SERVICE_DATE
FROM WORK.QUERY_FOR_CAR_SERVICE
GROUP BY t1.S_DATE;
QUIT;

我已经添加了我正在使用的代码。它给了我日期的计数,但还包括日期值为空的位置。

【问题讨论】:

  • 您需要包含您的查询和 SQL 方言。
  • 您应该查看WHERE 声明
  • Service_Date 是什么数据类型? (我假设约会,但我见过陌生人)
  • Beanie,您刚刚对问题所做的编辑没有帮助(并且在语法上无效)。您是否正在寻找一个查询来返回每个 CAR 的非缺失 S_DATE 值的数量?

标签: sql sas


【解决方案1】:

给定一个名为 CARS 的 SAS 数据集,其中包含您示例中的变量,您可以在 SQL 中以两种不同的方式找到具有非缺失值 service_date 的观察数:

proc sql;

   select count(service_date) as num_not_missing
   from cars;

   select count(*) as num_not_missing
   from cars
   where service_date is not null;

quit;

第一个示例在 count 函数中指定 service_date 变量,它将忽略缺失值。第二个计算应用where 子句后的所有行。两者的表现相同。

【讨论】:

  • @xQbert 服务只是一个日期。
【解决方案2】:

MS Sql Server 的两个选项:

SELECT COUNT([service_Date]) FROM [table1]

SELECT COUNT(*) FROM [table1] WHERE [service_Date] IS NOT NULL

有关COUNT() 的更多信息,请参阅MSDN

【讨论】:

    【解决方案3】:

    默认情况下,count(service_date) 排除空值,这与 count(*) 对所有行进行计数相反。

    【讨论】:

      【解决方案4】:

      你可以试试 WHERE column != "" 或者如果你没有 NULL 也许你可以使用 WHERE CHAR_LENGTH(column) > 3

      【讨论】:

        【解决方案5】:

        如果它可以来自另一个 Proc (Proc Means)

        data have;
         input car $ service_date mmddyy10.;
         format service_date mmddyy10.;
        datalines;
        honda 01/01/2005
        honda 01/01/2006
        honda
        honda 01/01/2008
        honda
        honda 01/01/2010
        toyota 01/01/2005
        toyota 01/01/2006
        toyota
        toyota 01/01/2008
        toyota
        toyota 01/01/2010
        ;
        
        Proc Means N data=work.have noprint; 
         var service_date;
         by car;
         output out=work.want(drop= _type_ _freq_)  n=count;
        run;
        

        【讨论】:

          【解决方案6】:

          拉马克,

          有几种方法可以解决这个问题。这是我将使用的方法,避免使用 PROC SQL。

          /* Set up example data */    
          data   YourTable;
          input id car $ service_Date;
          informat service_Date mmddyy10.;
          format service_Date mmddyy10.;
          cards;
          
          1 honda 01-01-2005
          2 honda 01-01-2006
          3 honda ""
          4 honda 01-01-2008
          5 honda ""
          6 honda 01-01-2010
          
          run;
          
          /* Count non null records */
          data work.CountTable(keep=NbrNulls);
           set work.YourTable(where=(service_date ne .)) end=last;
           if last;
           NbrNulls=_N_;
          run;
          

          根据您打算如何使用该计数,您可以在最后一个数据步骤的末尾添加一个“调用 symputx()”函数,以便在其他地方将其作为宏变量调用。

          结果是 4。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-12-05
            • 2021-12-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-09-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多