sql-server: переписать этот запрос, чтобы сделать значения в виде столбцов

#sql-server

#sql-server

Вопрос:

Приведенный ниже запрос присваивает вес каждому столбцу GER1, 2 и 3. Добавление к числу случаев роста, эффективности и риска. http://i.imgur.com/zGFGMNF.png

Как я могу переписать его так, чтобы он показывал те же результаты, но рост, эффективность и риск — это имена столбцов с score их значением. Показывать не нужно rank .

Желаемый результат:

 Growth    Efficiency   Risk

8            15          7 
  

  declare @MainHospital varchar(50)='Hospital1';
                                   WITH cte AS (
                                   SELECT 2 score, GER1 area FROM Survey
                                   WHERE MainHospital = @MainHospital
                                   UNION ALL
                                   SELECT 1 score, GER2 area FROM Survey
                                   WHERE MainHospital = @MainHospital
                                   UNION ALL
                                   SELECT 0 score, GER3 area FROM Survey
                                   WHERE MainHospital = @MainHospital
                                   ), cte2 AS (
                                   SELECT area, SUM(score) score FROM cte
                                   GROUP BY area
                                   HAVING area IS NOT NULL


                                   ), cte3 AS (
                                   SELECT area, score, 
                                   RANK() OVER (ORDER BY score DESC) rank
                                   FROM cte2
                                   )
                                   SELECT rank, area, score
                                   FROM cte3
                                   ORDER BY rank;
  

Исходя из предоставленного ответа, как я могу сконденсировать этот запрос

 SELECT    
   SUM(CASE WHEN [GER1] = 'Growth' THEN 2 ELSE 0 END) as "Growth",
   SUM(CASE WHEN [GER1] = 'Efficiency' THEN 2 ELSE 0 END) as Efficiency,
   SUM(CASE WHEN [GER1] = 'Risk' THEN 2 ELSE 0 END) as Risk,

   SUM(CASE WHEN [GER2] = 'Growth' THEN 1 ELSE 0 END) as "Growth",
   SUM(CASE WHEN [GER2] = 'Efficiency' THEN 1 ELSE 0 END) as Efficiency,
   SUM(CASE WHEN [GER2] = 'Risk' THEN 1 ELSE 0 END) as Risk,

   SUM(CASE WHEN [GER3] = 'Growth' THEN 0 ELSE 0 END) as "Growth",
   SUM(CASE WHEN [GER3] = 'Efficiency' THEN 0 ELSE 0 END) as Efficiency,
   SUM(CASE WHEN [GER3] = 'Risk' THEN 0 ELSE 0 END) as Risk,


FROM Survey
WHERE MainHospital = @MainHospital
GROUP BY MainHospital;
  

Ответ №1:

Для фиксированного количества столбцов я бы просто использовал оператор case, что-то вроде этих строк:

 ...
sum (case when area='Efficiency' then score else 0 end) as Efficiency,
...
  

Вы могли бы изучить поворот, но я думаю, что это намного проще.

РЕДАКТИРОВАТЬ: я не уверен, что полностью все понимаю. Но я не думаю, что вам нужно так много операторов case. Я думаю, вы можете сделать что-то вроде этого:

 sum (case 
  when [GER1] = 'Growth' then 2
  when [GER2] = 'Growth' then 1
  when [GER3] = 'Growth' then 0  -- If it's really 0 you could just leave this one out
  else 0 
end) as "Growth"...
  

Комментарии:

1. Имеет смысл, но не знаю, как это сделать, поскольку я не добавляю оценку только к эффективности. если эффективность находится в GER1, добавьте к ней 2. Добавьте 1, если это происходит в GER2

2. Я добавил пример, основанный на вашем объяснении.