Группировать множественные выражения CASE - PullRequest
0 голосов
/ 31 октября 2019

Итак, у меня есть простая таблица информации о студентах колледжа, которая состоит из:

  • ID (PK, int, not null)
  • Name (varchar (40), null)
  • Возраст (int, null)
  • Класс (text, null)
  • Major (text, null)

Я пытаюсь сгруппироватьученики разных основных классов, например, студенты-инженеры или физики, будут объединены в большую группу STEM. Мне пришлось преобразовать столбец Major в varchar, поэтому код немного запутан, но вот мой запрос:

SELECT 
    CASE
        WHEN CONVERT(VARCHAR(20), sr.Major) IN ('Calculus', 'Mechanical Engineer', 'Software Engineer', 'Web Design', 'Chemistry', 'Physics', 'Graphic Design')
            THEN 'STEM'
        WHEN CONVERT(VARCHAR(20), sr.Major) IN ('Pre Med', 'Neuroscience')
            THEN 'Medical'
        WHEN CONVERT(VARCHAR(20), sr.Major) IN ('Poly Sci', 'Pre Law', 'Visual Comminucatoins', 'Communications', 'Psycology', 'Philosophy', 'History')
            THEN 'Social Science'
        WHEN  CONVERT(VARCHAR(20), sr.Major) IN ('Spanish', 'English', 'Linguistics')
            THEN 'Language'
        ELSE CONVERT(VARCHAR(20), sr.Major)
    END AS Major
FROM dbo.StudentRoster AS sr;
GROUP BY  CONVERT(VARCHAR(20), sr.Major);

Результат:

**Major**
Undeclared
STEM
Social Science
Medical
Social Science
Undeclared
Language
Social Science
STEM
Medical
Undeclared
Language
STEM
STEM
Social Science
Undeclared
STEM
Visual Comminucatoin
Social Science
Undeclared
Undeclared
Undeclared
Social Science
STEM
Language
STEM

Как сгруппироватьВыражения CASE, чтобы я мог получить индивидуальные подсчеты для STEM, Medical и т. Д.?

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Вы можете использовать внутренний запрос для вычисления выражения регистра перед выбором / группировкой:

SELECT Major, COUNT(*)
FROM 
(
  SELECT 
    CASE
        WHEN CONVERT(VARCHAR(20), sr.Major) IN ('Calculus', 'Mechanical Engineer', 'Software Engineer', 'Web Design', 'Chemistry', 'Physics', 'Graphic Design')
            THEN 'STEM'
        WHEN CONVERT(VARCHAR(20), sr.Major) IN ('Pre Med', 'Neuroscience')
            THEN 'Medical'
        WHEN CONVERT(VARCHAR(20), sr.Major) IN ('Poly Sci', 'Pre Law', 'Visual Comminucatoins', 'Communications', 'Psycology', 'Philosophy', 'History')
            THEN 'Social Science'
        WHEN  CONVERT(VARCHAR(20), sr.Major) IN ('Spanish', 'English', 'Linguistics')
            THEN 'Language'
        ELSE CONVERT(VARCHAR(20), sr.Major)
    END AS Major
  FROM dbo.StudentRoster AS sr
) AS T
GROUP BY  Major
0 голосов
/ 31 октября 2019

Решение вашего вопроса довольно простое. Просто добавьте функцию count (*) в запрос.

SELECT 
    CASE
        WHEN CONVERT(VARCHAR(20), sr.Major) IN ('Calculus', 'Mechanical Engineer', 'Software Engineer', 'Web Design', 'Chemistry', 'Physics', 'Graphic Design')
            THEN 'STEM'
        WHEN CONVERT(VARCHAR(20), sr.Major) IN ('Pre Med', 'Neuroscience')
            THEN 'Medical'
        WHEN CONVERT(VARCHAR(20), sr.Major) IN ('Poly Sci', 'Pre Law', 'Visual Comminucatoins', 'Communications', 'Psycology', 'Philosophy', 'History')
            THEN 'Social Science'
        WHEN  CONVERT(VARCHAR(20), sr.Major) IN ('Spanish', 'English', 'Linguistics')
            THEN 'Language'
        ELSE CONVERT(VARCHAR(20), sr.Major)
    END AS Major, COUNT(1)
FROM dbo.StudentRoster AS sr
GROUP BY  CONVERT(VARCHAR(20), sr.Major);

Обратите внимание, что в конце оператора CASE ... END я добавил функцию COUNT (1). Это даст вам счет для каждого майора, которого вы сгруппировали.

...