Я думаю, что ответ GMB был довольно хорошим, но если есть тип без элементов (что-то в ваших требованиях), он не будет отображаться. Итак, во-первых, давайте создадим входные данные:
select 1 as Type_ID, 'Example 1' as Type_Description into #type
union all
select 2, 'Example 2'
union all
select 3, 'Example 3'
select 1 Result_ID, 1 Item_ID, 10 Cost into #item
union all
select 2, 1, 20 Cost
union all
select 3, 2, 5 Cost
union all
select 4, 5, 100 Cost
select 1 Item_ID, 1 Item_Type INTO #item_type
union all
select 2, 1
union all
select 3, 1
union all
select 4, 2
union all
select 5, 2
Примечание. Я добавил также тип 3 без элементов, чтобы проверить регистр без элементов.
А затем запрос, который вам нужен:
SELECT
t.Type_ID,
COUNT(DISTINCT it.Item_ID) Item_Count,
COUNT(DISTINCT i.Result_ID) Result_Count,
SUM(ISNULL(Cost, 0)) Cost
FROM #type t
LEFT JOIN #item_type it on it.Item_Type = t.Type_ID
LEFT JOIN #item i on i.Item_ID = it.Item_ID
GROUP BY t.Type_ID
Я думаю, что это довольно просто и не требует особых объяснений, но не стесняйтесь спрашивать в комментариях, если это необходимо.
Результаты такие же, как вы просили, а также строка для типа 3:
+---------+------------+--------------+------+
| Type_ID | Item_Count | Result_Count | Cost |
+---------+------------+--------------+------+
| 1 | 3 | 3 | 35 |
+---------+------------+--------------+------+
| 2 | 2 | 1 | 100 |
+---------+------------+--------------+------+
| 3 | 0 | 0 | 0 |
+---------+------------+--------------+------+
Вы упомянули, что количество элементов может быть 0, а также количество результатов. Но разве оба значения не всегда либо 0
, либо оба > 0
? Только в том случае, если в таблице типа «многие-ко-многим» элемента типа «FK» нет такого сценария. Например, если я добавлю:
insert into #item_type
select 6, 3
Тогда последняя строка будет:
+---------+------------+--------------+------+
| 3 | 1 | 0 | 0 |
+---------+------------+--------------+------+
Я не уверен, имеет ли это смысл в вашем сценарии, но поскольку ваше сообщение подразумевает, что элементы и результаты могут быть равны 0 независимо, что меня немного смутило.