2017-08-17 37 views
1

我正在嘗試使用SAS/SQL從事務數據的數據集創建百分比列表,以瞭解特定部門如何爲特定季度的整體銷售數量做出貢獻。例如,如果有100個銷售處ID 234980和那些20的人在部門在2006年第四季度,則列表應該輸出:表格不能正確聚合

Store ID 234980 , 20%. 

這是我用來實現這一結果的代碼。

data testdata; 
    set work.dataset; 
    format PostingDate yyq.; 
run; 

PROC SQL; 
    CREATE TABLE aggregatedata AS 
     SELECT DISTINCT testdata.ID, 
      SUM(CASE 
        WHEN testdata.Store='A' THEN 1 ELSE 0 
         END)/COUNT(Store) as PERCENT, 
      PostingDate 
     FROM work.testdata 
     group by testdata.ID, testdata.PostingDate; 
QUIT; 

不過,我收到的輸出更像是這樣的:

StoreID DepartmentA Quarter 
    100   1 2014Q1 
    100   0 2014Q2 
    100   1 2014Q2 
    100   0 2014Q2 
    100   0 2014Q2 
    100   0 2014Q2 
    101   1 2015Q3 
    101   0 2015Q3 
    101   0 2015Q4 

爲什麼我的代碼不骨料商店水平?

+1

因爲您包含日期字段 - 您希望在彙總之前將其轉換爲四分之一。 – Hogan

+0

@Hogan數據步驟適當地轉換格式。 –

+0

數據步驟將轉換輸出 - 這對服務器上發生的內部組無效。試着把這個領域拿出來,看看結果是否改變。 – Hogan

回答

1

如果您想按QTR進行分組,那麼您需要將日期值轉換爲季度值。否則'01JAN2017'd和'01FEB2017'd將被視爲兩個不同的值,儘管它們都會使用YYQ顯示相同的值。格式。

proc sql; 
create table aggregatedata as 
    select id 
     , intnx('qtr',postingdate,0,'b') as postingdate format=yyq. 
     , sum(store='A')/count(store) as percent 
    from work.testdata 
    group by 1,2 
; 
quit; 
1

你不想同時設置DISTINCT和GROUP BY

也許嘗試:

select t.testingdate 
     ,t.StoreID 
     ,t.Department 
     ,count(t.*)/count(select t2.* 
          from testdata t2 
          where t.testingdate = t2.testingdate 
          and t.StoreID = t2.StoreID) AS Percentage 
from testdata t 
group by t.testingdate 
     ,t.StoreID 
     ,t.Department 

或者你可以使用一個左連接,這可能是更有效的。嵌套選擇來統計所有記錄,不管部門可能更清楚地閱讀。