2013-10-04 4 views
0

Я хотел бы сгруппировать определенные значения в результирующем наборе как новое значение.SQL GROUP BY значения набора результатов под новым значением

например, мой набор результатов:

KS2 
2a 
3c 
4c 
3c 
2a 
2a 
1c 
No KS2 
1b 
2c 
5c 
4c 

Мой currrent SQL на дне результатов группы в следующем:

KS2 
2a 
3c 
4c 
1c 
No KS2 
1b 
2c 
5c 
4c 

Я хотел бы сгруппировать значения 1a, 1b и 1c в одна строка под значениями 1 и 2a, 2b и 2c как 2. Все остальные значения должны группироваться нормально. Так что мой результирующий набор будет выглядеть так:

KS2 
2 
3c 
4c 
1 
No KS2 
5c 
4c 

Вот мой код, как он стоит:

GROUP BY 
CASE Name 
    WHEN 'English' THEN 
     CASE WHEN [Ks2en]=NULL OR [Ks2en]='' THEN 
      'No KS2' 
     ELSE 
      [Ks2en] 
     END 
    WHEN 'Mathematics' THEN 
     CASE WHEN [Ks2ma]=NULL OR [Ks2ma]='' THEN 
      'No KS2' 
     ELSE 
      [Ks2ma] 
     END 
    ELSE 
     CASE WHEN [Ks2av]=NULL OR [Ks2av]='' THEN 
      'No KS2' 
     ELSE 
      [Ks2av] 
     END 
    END 

EDIT: Вот решение, основанное на ответ EricZ в:

GROUP BY 
     CASE Name 
      WHEN 'English' THEN 
       CASE WHEN [Ks2en] IS NULL OR [Ks2en]='' THEN 
        'No KS2' 
       WHEN [Ks2en] IN ('1a','1b','1c') THEN 
        '1' 
       WHEN [Ks2en] IN ('2a','2b','2c') THEN 
        '2' 
       ELSE 
        [Ks2en] 
       END 
      WHEN 'Mathematics' THEN 
       CASE WHEN [Ks2ma] IS NULL OR [Ks2ma]='' THEN 
        'No KS2' 
       WHEN [Ks2ma] IN ('1a','1b','1c') THEN 
        '1' 
       WHEN [Ks2ma] IN ('2a','2b','2c') THEN 
        '2' 
       ELSE 
        [Ks2ma] 
       END 
      ELSE 
       CASE WHEN [Ks2av] IS NULL OR [Ks2av]='' THEN 
        'No KS2' 
       WHEN [Ks2av] IN ('1a','1b','1c') THEN 
        '1' 
       WHEN [Ks2av] IN ('2a','2b','2c') THEN 
        '2' 
       ELSE 
        [Ks2av] 
       END 
      END 
+1

Вы можете поделиться полный запрос и пример ваших данных? Какую колонку имен вы группируете? – Mureinik

+0

@Mureinik - Я добавил полный запрос для вас. Столбец, который я группирую, это «KS2», который является значениями в Ks2en, Ks2ma или Ks2av в зависимости от содержимого переменной SubjectName. – Matt

+0

Теперь это то, что я называю безопасностью работы. Иногда бывает лучше разбить запросы на несколько более мелких. – Trent

ответ

1

Вы хотите что-то вроде этого?

GROUP BY 
CASE 
    WHEN Name = 'English' THEN ISNULL(NULLIF([Ks2en],''),'No KS2') 
    WHEN Name = 'Mathematics' THEN ISNULL(NULLIF([Ks2ma],''),'No KS2') 
    WHEN [Ks2av] IN ('1a','1b','1c') THEN '1' 
    WHEN [Ks2av] IN ('2a','2b','2c') THEN '2'  
    ELSE ISNULL(NULLIF([Ks2av],''),'No KS2') 
END 

Пожалуйста, обратите внимание, что в вашем коде вы имеете [Ks2en]=NULL всегда возвращает ложь, вы могли бы использовать [Ks2en] IS NULL проверить значение NULL

+0

Привет, EricZ, это по правому краю. Это 'WHEN [Ks2av] IN ('1a', '1b', '1c') THEN '1'', что представляет особый интерес. Я применил его к моему коду, но сгруппированные значения исчезают из набора результатов. Также взял на борт советую NULL. – Matt

+0

Я обнял его. У меня была установка JOIN в другую таблицу, у которой нет значений снова «1», поэтому я добавил значения, и он показал, что это нормально. Изменен JOIN на LEFT JOIN и ваш код работает. Благодарю. – Matt

0

Вы можете использовать другую таблицу для хранения «группирования поведения». Это coul - таблица с двумя столбцами, содержащая записи типа ('1a', '1'), ('1b', '1'), ('2a', '2') и т. Д.

Херес SQLFiddle, где поставили пример вместе: http://sqlfiddle.com/#!2/deb87/7