#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. Я добавил пример, основанный на вашем объяснении.