Вычисление сгруппированных счетчиков при использовании инструкции Case

#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. спасибо, кажется, я просто не заметил эту повторяющуюся строку!!