2016-04-14 3 views

ответ

2

Если ваша база данных поддерживает APPLY/UNPIVOT оператор, то использовать этот метод

CROSS APPLY

SELECT id, 
     SUM(CASE WHEN val = 'O' THEN 1 ELSE 0 END) O, 
     SUM(CASE WHEN val = 'R' THEN 1 ELSE 0 END) R, 
     SUM(CASE WHEN val = 'S' THEN 1 ELSE 0 END) S 
FROM mytable 
     CROSS apply (VALUES (sem1), 
          (sem2), 
          (sem3), 
          (sem4), 
          (sem5), 
          (sem6), 
          (sem7)) cs(val) 
GROUP BY id 

UNPIVOT метод

SELECT id, 
     SUM(CASE WHEN val = 'O' THEN 1 ELSE 0 END) O, 
     SUM(CASE WHEN val = 'R' THEN 1 ELSE 0 END) R, 
     SUM(CASE WHEN val = 'S' THEN 1 ELSE 0 END) S 
FROM (SELECT * 
     FROM mytable) a 
     UNPIVOT (val 
       FOR col IN (sem1, 
          sem2, 
          sem3, 
          sem4, 
          sem5, 
          sem6, 
          sem7)) upv 
GROUP BY id 

Я лично предпочитаю CROSS APPLY метод над UNPIVOT, так как он является более удобным для чтения. Производительность будет одинаковой.

Смежные вопросы