2017-05-08 66 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」價值缺失值,而不是指望它。