t SQL агрегатные функции и группировка - PullRequest
0 голосов
/ 15 апреля 2020

Итак, я не могу найти способ заставить это работать. Но мне нужно следующее:

У меня есть таблица, в которой можно указать типы.

Type_ID, Type_Description

Затем у меня есть таблица предметов. [Тип элемента fk для таблицы типов]

Item_ID, Item_Type

Тогда у меня есть таблица результатов. [Item_ID - это fk to Item item]

Result_ID, Item_ID, Cost

Итак, что мне нужно для вывода, сгруппировано по Type_ID - Количество элементов (может быть 0), - Количество результатов (может быть 0) , - и сумма стоимости (может быть 0)

У меня нет прямого доступа к этим таблицам. Мне нужно собрать sql и отправить его в API, чтобы я не узнал об ошибке просто результаты, если она прошла успешно, и ошибку 500, если нет.

Кажется, что старше t SQL. Поскольку List и STRING_AGG не доступны.

РЕДАКТИРОВАТЬ: По запросу - Пример данных

 +---------+------------------+ 
 | Type_ID | Type_Description | 
 +---------+------------------+
 |    1    |    Example 1     |
 +---------+------------------+
 |    2    |    Example 2     |
 +---------+------------------+
 +---------+---------------+ 
 | ITEM_ID |   ITEM_TYPE   | 
 +---------+---------------+
 |    1    |       1       |
 +---------+---------------+
 |    2    |       1       |
 +---------+---------------+
 |    3    |       1       |
 +---------+---------------+
 |    4    |       2       |
 +---------+---------------+
 |    5    |       2       |
 +---------+---------------+
 +-----------+---------+------+ 
 | Result_ID | Item_ID | Cost | 
 +-----------+---------+------+ 
 |     1     |    1    |  10  |
 +-----------+---------+------+
 |     2     |    1    |  20  |
 +-----------+---------+------+
 |     3     |    2    |   5  |
 +-----------+---------+------+
 |     4     |    5    |  100 |
 +-----------+---------+------+ 

Желаемый вывод

 +---------+------------+--------------+------+
 | Type_ID | Item_Count | Result_Count | Cost |
 +---------+------------+--------------+------+
 |    1    |      3     |       3      |  35  |
 +---------+------------+--------------+------+
 |    2    |      2     |       1      |  100 |
 +---------+------------+--------------+------+

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Я думаю, что ответ 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 независимо, что меня немного смутило.

0 голосов
/ 15 апреля 2020

Вы можете объединяться и объединяться. Предполагая, что ваши таблицы называются types, types_costs и costs, это будет:

select 
    t.type_id, 
    count(distinct tc.item_id) item_count, 
    count(distinct c.result_id) result_count, 
    sum(c.cost) cost
from types t
inner join types_costs tc on tc.item_type = t.type_id
left costs c on c.item_id = tc.item_id
group by t.type_id

Важно использовать left join, чтобы вывести таблицу costs так, item_id s, которых нет в costs, не удаляются до того, как вы получите изменение для их подсчета. В зависимости от вашего фактического варианта использования, вы можете также выбрать left join для таблицы types_costs.

...