There is a possibility of using a "Virtual Layer" through Layer > Add Layer > Add/Edit Virtual Layer...
.
Let's assume there is a point layer called 'Random points in polygons' and a polygon layer called 'municipality_1' with their attribute tables.
With the following query, it is possible to count points within a polygon layer, grouped by an attribute of the points.
SELECT poly.*, countA, countB, countC
FROM "municipality_1" AS poly
LEFT JOIN (
SELECT poly.id AS idA, count(1) AS countA
FROM "Random points in polygons" AS poi, "municipality_1" AS poly
WHERE st_within(poi.geometry, poly.geometry)
AND poi.attribute = 'A'
GROUP BY poly.id
) ON poly.id = idA
LEFT JOIN (
SELECT poly.id AS idB, count(1) AS countB
FROM "Random points in polygons" AS poi, "municipality_1" AS poly
WHERE st_within(poi.geometry, poly.geometry)
AND poi.attribute = 'B'
GROUP BY poly.id
) ON poly.id = idB
LEFT JOIN (
SELECT poly.id AS idC, count(1) AS countC
FROM "Random points in polygons" AS poi, "municipality_1" AS poly
WHERE st_within(poi.geometry, poly.geometry)
AND poi.attribute = 'C'
GROUP BY poly.id
) ON poly.id = idC
The output polygon layer with its attribute table will look like this: