2017-05-08 29 views
1

我有一个数据集计数SAS SQL情况不同,当

Outlet Period  Brand Sales 
A   Jan   XX  12 
A   Jan   XY  13 
A   FEB   AB  10 
B   JAN   AC  19 

我想计算的不同品牌的数量每个周期内的每个时期,但不包括品牌的“CD”。我想问一下,如下所示,统计数字不能在单行中起作用,但仅适用于示例2?

实施例1(商标CD进行计数,即使它不应该是)

PROC SQL; 
     CREATE TABLE Test AS 
      SELECT  
        Outlet, Period, Brand, 

       case when Brand not in ('CD') then count (distinct Brand) end as k_Brands_Players2 

     group by period, outlet; 
quit; 

实施例2(品牌CD被正确地不计算在内)

PROC SQL; 
     CREATE TABLE Test AS 
      SELECT  
        Outlet, Period, Brand, 

       case when Brand not in ('CD') then Brand else ' ' end as Brand_Players, 
       count(distinct calculated Brand_Players) as k_Brands_Players 


     group by period, outlet; 
quit; 

预期的输出是:

Outlet  Period  Brand  k_Brands_Players 
    A   Jan  XX   2 
    A   Jan  XY   2 
    A   Feb  AS   3 
    A   FEB  QW   3 
    A   Feb  XY   3 
    B   Jan  KW   1 
    .... 
+0

数据集的预期输出是什么? –

+0

我刚加了,谢谢提醒! – user90831

+0

您的发布的信息没有任何记录与品牌='CD' – Tom

回答

1

试试这个: -

/*Count distinct will come outside the case when statement*/ 

PROC SQL; 
    CREATE TABLE Test AS 
    SELECT distinct Outlet, Period, Brand, k_Brands_Players 
    from 
    YOUR_DATASET_NAME a 
    LEFT JOIN 
    (
     SELECT  
       Outlet, Period, 

      count(distinct(case when Brand not in ('CD') then Brand end)) as k_Brands_Players 

     FROM YOUR_DATASET_NAME 
    group by 1,2 
) b 
    on a.Outlet=b.Outlet and a.Period=b.Period; 
quit; 

让我知道如果您有任何疑问

+0

编辑查询以获得符合要求的输出 –

+0

感谢它的工作!但是,我可以知道导致第一个例子中的错误的原因吗? – user90831

+0

我以前的查询没有在输出中给出品牌名称。改变它得到那 –

2

在你第一次查询的问题是,你正在使用COUNT()聚集函数在错误的地方。你有

case when Brand not in ('CD') then count(distinct Brand) end 

所以当BRAND等于“CD”,你会得到一个丢失的价值,否则你将得到不同品牌的数量,包括“CD”品牌。

相反,如果你使用这种结构:

count(distinct case when Brand not in ('CD') then Brand end) 

则COUNT()函数将看到“CD”价值缺失值,而不是指望它。