I have 3 tables:
SELECT id, letter FROM As
+--------+--------+
|     id | letter |
+--------+--------+
|      1 | A      |
|      2 | B      |
+--------+--------+
SELECT id, letter FROM Xs
+--------+------------+
|     id |   letter   |
+--------+------------+
|      1 | X          |
|      2 | Y          |
|      3 | Z          |
+--------+------------+ 
SELECT id, As_id, Xs_id FROM A_X
+--------+-------+-------+
|     id | As_id | Xs_id |
+--------+-------+-------+
|      9 |     1 |     1 |
|     10 |     1 |     2 |
|     11 |     2 |     3 |
|     12 |     1 |     2 |
|     13 |     2 |     3 |
|     14 |     1 |     1 |
+--------+-------+-------+
I can count all As and Bs with group by. But I want to count As and Bs based on X,Y and Z. What I want to get is below:
+-------+
| X,Y,Z |
+-------+
| 2,2,0 |
| 0,0,2 |
+-------+
  X,Y,Z
A 2,2,0
B 0,0,2
What is the best way to do this at MSSQL? Is it an efficent way to use foreach for example?
edit: It is not a duplicate because I just wanted to know the efficent way not any way.