BookmarkSubscribeRSS Feed
Arimitra
Calcite | Level 5

Hi All,

I have a table of 1500 observations with Subcategory and their Sales value. I want to find out the count of each subcategory group by subcategory in one table.

In total there are 6 unique subcategories.

proc sql noprint;

count(distinct Subcategory)

:n

candy_sales_summary;

distinct(Subcategory)

:C1 - :C%left(&n)

candy_sales_summary;

;

%put &n;

%put &C3;

I am unable to complete the below code.

%macro calc;
%let i = &n;
%let j = %eval(&n - 1);
%do %until (&i ge &j);
proc sql;
create table Test as
select Subcategory,count(Subcategory) as Units
from candy_sales_summary
where Subcategory in ("&&C&i")
group by Subcategory

union all

select Subcategory,count(Subcategory) as Units
from candy_sales_summary
where Subcategory in ("&&C&j")
group by Subcategory
;
quit;
run;
%end;
%mend calc;
%calc;

Is there any way in sql where I can iteratively append the count of each subcategory in one table

For example when I run this, I get count of only two, when I need all 6 in one table

proc sql;

select Subcategory,count(Subcategory) as Units

from candy_sales_summary

where Subcategory in ('Mixed')

group by Subcategory

union all

select Subcategory,count(Subcategory) as Units

from candy_sales_summary

where Subcategory in ('Gum')

group by Subcategory

;

quit;

Please help

8 REPLIES 8
Arimitra
Calcite | Level 5

I beg you pardon for the typo error. When I counting the distinct subcategories which I dont know in advance I am using the below:-

proc sql noprint;

select count(distinct Subcategory)

into :n

from candy_sales_summary;

select distinct(Subcategory)

into :C1 - :C%left(&n)

from candy_sales_summary;

quit;

Reeza
Super User

proc sql;

select Subcategory,count(Subcategory) as Units

from candy_sales_summary

where Subcategory in ('Mixed')

group by Subcategory

union all

select Subcategory,count(Subcategory) as Units

from candy_sales_summary

where Subcategory in ('Gum')

group by Subcategory

;

quit;

should be equivalent to the following where you've removed the where clause.

proc sql;

create table want as

select Subcategory,count(Subcategory) as Units

from candy_sales_summary

where Subcategory in ('Gum')

group by Subcategory

;

quit;

You may want to consider proc freq as well.

proc freq data=candy_sales_summary;

table subcategory;

run;

Arimitra
Calcite | Level 5

The intent of this query is I dont know how many subcategories to count. so I would need where clause to query which subcategories to count.

Tom
Super User Tom
Super User

Why are you generating macro variables?

What is it that you are actually trying to do? 

You do not need to count in advance. Use the automatic macro variable SQLOBS after the select to see how many values were found.

Just set the upper bound on macro variable range larger than the possible answer.

proc sql noprint;

select distinct Subcategory into :C1 - :C999999

from candy_sales_summary

;

%let n=&sqlobs ;

quit;

Tom
Super User Tom
Super User

If you have Subcategories shouldn't you have a Category?

See if you can relate you query to the SASHELP.CARS sample dataset.

This query will show me that there are 2 Makes of Hybrid cars and 3 total models of Hybrid cars.

proc sql noprint ;

create table want as

  select type,count(*) as num_makes, sum(num_models) as total_models

       , make,num_models

  from

    ( select type,make,count(distinct model) as num_models

      from sashelp.cars

      group by type, make

    )

  group by type

  order by type, make

;

quit;

proc print; run;

Arimitra
Calcite | Level 5


Hi Tom,

Attached is the query, I have tried to create separate tables for each subcategory but I found no way to append them. The output is required in one table.

I am unable to attach the excel file data. Not sure if I have explained my query properly

Please help.


Screenshot.JPG
OscarHernandez
SAS Employee

Hi Arimitra, I'm not sure I understood your question but I wrote the attached code that could be useful.

In general, the code does this:
Step 1: Create sample data.

Step 2: Generate a table that shows the count of subcategories and the total sales amount per each subcategory, everything grouped by date. To achieve this result I did the following:

2.1. Extract a list of distinct subcategories values.

2.2. Extract a list of disctinct dates.

2.3. Perform a cross join in order to generate a list with all posible combinations of subcategories per date.

2.4. Calculate a table with the count of subcategories per date and their corresponding total sales amount.

2.5. Perform a left join in order to complement the table from step 2.3 with its matching subcategory count and total sales amount. As we don't have subcategories for all dates you'll get a missing value for those cases.

You may find this process long, and your original question was related to having one single query to achive the result. In response to this question, you can take a look on the next step.

Step 3: This piece of code is a way to have a single query to do the previous steps, it involves subqueries and Cartesian products, but it is NOT a viable solution and I wouldn't suggest by any means use of it, because of the mentioned Cartesian products and remerging (iterative) processes involved. It is not a good practice and you shouldn't consider it for a real implementation, in fact, step 2.3 will generate a Cartesian product so please keep in mind only steps 1 and 2, they can be considered as a possible solution for this example.

Best Regards,

Oscar

UrvishShah
Fluorite | Level 6

Hi

And ya one more thing to say in this case is that if you supply COUNT(DISTINCT Subcategory) then SAS has to two pass through the data that is one time it will remove the duplicates and then in second pass it will count...So of cource if you have more subcategories then it will take much and muchhh time....So either use Proc Freq or Proc Sort followed by Data Step...


Thanks,

Urvish

sas-innovate-2024.png

Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.

 

Register now!

What is Bayesian Analysis?

Learn the difference between classical and Bayesian statistical approaches and see a few PROC examples to perform Bayesian analysis in this video.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 8 replies
  • 1343 views
  • 0 likes
  • 5 in conversation