#sql-server #group-by #count #sql-server-2012 #case
#sql-сервер #группировка по #подсчет #sql-server-2012 #case
Вопрос:
Используя SQL Server 2012 — я пытаюсь выполнить подсчет отдельных объектов из базы данных, сгруппированных по их стране и региону, а также по типу компании, к которой они относятся. Эта последняя часть является проблемой — поскольку существует так много «типов», я пытаюсь сгруппировать их в 3 категории: общедоступные, частные и с общим охватом, все остальное переходит в «Другое», используя оператор case.
Запрос выдает желаемый результат, однако я просто не могу заставить запрос группировать счетчики по выбранным мной категориям. Изначально у меня был оператор CASE в основном запросе select, но, найдя аналогичный вопрос в другом месте, я переместил его в подзапрос, но я столкнулся с той же проблемой. Запрос ниже с примером вывода:
SELECT COUNT(DISTINCT ent.factset_entity_id) AS Count,
d.[Entity Type],
YEAR(r.repr_timeslot_date) AS [Year],
cty.country_desc AS Country,
reg.region_desc AS Region
FROM
(SELECT
entity_type_code,
CASE
WHEN entity_type_code = 'PUB'
THEN 'Public'
WHEN entity_type_code IN ('PVT', 'HOL', 'JVT', 'SUB')
THEN 'Private'
ELSE 'Other'
END AS [Entity Type]
FROM
ref_v2.entity_type_map) AS d
JOIN
sym_v1.sym_entity AS ent ON ent.entity_type = d.entity_type_code
JOIN
sdfdemo.sym_v1.sym_sec_entity AS se ON ent.factset_entity_id = se.factset_entity_id
JOIN
repr_v1.repr_factset_id_map AS reprisk ON se.fsym_id = reprisk.factset_id
JOIN
repr_v1.repr_rri AS r ON r.repr_company_id = reprisk.provider_id
JOIN
ref_v2.country_map AS cty ON cty.iso_country = ent.iso_country
JOIN
ref_v2.region_map AS reg ON reg.region_code = cty.region_code
JOIN
ref_v2.entity_type_map AS ety ON ety.entity_type_code = ent.entity_type
WHERE
reprisk.id_end_date IS NULL
AND reprisk.factset_id IS NOT NULL
AND ent.iso_country IN ('SG')
AND YEAR(r.repr_timeslot_date) = '2020'
AND r.repr_rating IS NOT NULL
GROUP BY
d.[Entity Type], cty.country_desc, reg.region_desc,
ent.entity_type, YEAR(r.repr_timeslot_date);
Текущий вывод:
Подсчет | Тип объекта | Год | Страна | Регион |
---|---|---|---|---|
1 | Другое | 2020 | Сингапур | Азия |
2 | Другое | 2020 | Сингапур | Азия |
12 | Другое | 2020 | Сингапур | Азия |
2 | Другое | 2020 | Сингапур | Азия |
3 | Частное | 2020 | Сингапур | Азия |
455 | Общедоступный | 2020 | Сингапур | Азия |
5 | Частное | 2020 | Сингапур | Азия |
Требуемый вывод:
Подсчет | Тип объекта | Год | Страна | Регион |
---|---|---|---|---|
8 | Частное | 2020 | Сингапур | Азия |
455 | Общедоступный | 2020 | Сингапур | Азия |
17 | Другое | 2020 | Сингапур | Азия |
Очень признателен за любые рекомендации!
Комментарии:
1. К вашему СВЕДЕНИЮ: это выражение case, а не оператор.
Ответ №1:
Проблема в вашем GROUP BY
, вы хотите сгруппировать по вашему вычисленному, а [Entity Type]
не по тому, в sym_v1.sym_entity
котором.
Измените ваше GROUP BY
предложение на это:
GROUP BY d.[Entity Type],
cty.country_desc,
reg.region_desc,
YEAR(r.repr_timeslot_date);
Здесь я удалил ent.entity_type
из вашего GROUP BY
, поскольку вы на самом деле не хотите группировать по этому, вы хотите группировать по своему вычисляемому столбцу, который вы уже включили.
Это то, что вызывало ваши дубликаты.
Комментарии:
1. спасибо, кажется, я просто не заметил эту повторяющуюся строку!!