Hopefully this is what you're looking for.
For this example, I'm using the following SharePoint List. I'll filter on Pet Species for my CSV tables.

See full flow below. I'll go into each of the actions.

Condition for Dogs

Condition for Cats

Initialize variable creates a variable of type array called csvData. This will contain all the CSV tables that we can add to the email.

Each of the Parallel branches are exactly the same, except for the filtering on Get items, and the name we provide for the CSV table. So, I'll just go through the Dogs branch.
Get items Dogs returns all the items from our list where the Pet Species is equal to 'Dog'.

Condition Dogs checks to see if the length of the items returned is greater than 0 (at least one item returned). If the condition is true, we go into the Yes branch and create our CSV table. The expression used is:
length(outputs('Get_items_Dogs')?['body/value'])

Within the Yes branch...
Create CSV table Dogs uses the output from Get items Dogs and maps a couple of fields that we want in our CSV table.

Append to array variable Dogs appends our CSV table to our csvData array variable.
{
"Name": "Dogs.csv",
"ContentBytes": @{body('Create_CSV_table_Dogs')}
}

After all the parallel branches have completed our csvData array would contain all the CSV tables that were created.
Send an email uses the csvData array variable as the Attachments array. Note that for our Attachments, we need to switch to input entire array, then add our csvData variable.

When we run the flow, an email will be sent with all the CSV files we created (the branches that had at least one item).

----------------------------------------------------------------------
If I've answered your question, please mark the post as Solved.
If you like my response, please consider giving it a Thumbs Up.