2013-06-03 3 views
1

Я пытаюсь создать VIEW, где я должен иметь следующие столбцы:Dynamic SUM() при использовании Sum (Case) на ЗРЕНИЯ в MSSQL

Clinic_id | Result_month_id | AVF | AVC | AVG | Другое | Всего_Days

Всего_Days следует рассчитывать динамически с использованием (AVF + AVC + [AVG] + прочее).

SQL-запросов является:

CREATE VIEW Rate AS 

SELECT 
clinic_id, result_month_id, 
sum(case v_id when 'ula' then [days] else 0 end) as AVF, 
sum(case v_id 
     when 'ter' then [days] 
     when 'theter' then [days] 
     when 'p_theter' then [days] 
     when 't_theter' then [days] 
     else 0 
    end) as AVC, 
sum(case v_id when 's_graft' then [days] else 0 end) as [AVG], 
sum(case v_id when 'other' then [days] else 0 end) as [Other] 

FROM [Server].[DBName].[TableName] 

GROUP BY clinic_id, result_month_id 
; 

Я пытался добавить последнюю колонку, используя

SELECT 
    columns, 
    .... 
    (AVF+AVC+[AVG]+Other)as Total_Days 

    FROM 
    (SELECT 
     the QUERY displayed above... 
)q 

Но выше не работает. Любая идея, как я могу динамически создать Total из четырех столбцов, которые я создаю в VIEW?

+1

Это должно работать. В чем проблема? –

+1

_Но выше не работает_ Вы получили сообщение об ошибке? – Taryn

+0

Проблема была около оператора FROM перед Q и; знак VIEW был добавлен по ошибке. Теперь это сработало. – shaz

ответ

1

Вы можете использовать подзапрос для этого:

CREATE VIEW Rate AS 
select t.*, AVC + [AVG] + Other as TotalDays 
from (SELECT clinic_id, result_month_id, 
      sum(case v_id when 'ula' then [days] else 0 end) as AVF, 
      sum(case v_id 
        when 'ter' then [days] 
        when 'theter' then [days] 
        when 'p_theter' then [days] 
        when 't_theter' then [days] 
        else 0 
       end) as AVC, 
      sum(case v_id when 's_graft' then [days] else 0 end) as [AVG], 
      sum(case v_id when 'other' then [days] else 0 end) as [Other] 
     FROM [Server].[DBName].[TableName] 
     GROUP BY clinic_id, result_month_id 
    ) t 
+0

t. * Это хорошая идея, а затем снова записать все имена столбцов. Это намного чище. Благодарю. – shaz

+0

@shaz. , , Вы услышите совет, чтобы никогда не использовать 'select *'. Хотя в целом хорошая практика, 'select *' весьма полезна при выборе результата из подзапросов или CTE. –

+0

Спасибо за ваш совет. Вспомни это. – shaz

3

Простейшее путь будет использовать КТР.

CREATE VIEW Rate AS 

WITH CalculatedValues AS (
    SELECT 
     clinic_id, result_month_id, 
     sum(case v_id when 'ula' then [days] else 0 end) as AVF, 
     sum(case v_id 
       when 'ter' then [days] 
       when 'theter' then [days] 
       when 'p_theter' then [days] 
       when 't_theter' then [days] 
       else 0 
      end) as AVC, 
     sum(case v_id when 's_graft' then [days] else 0 end) as [AVG], 
     sum(case v_id when 'other' then [days] else 0 end) as [Other] 
    FROM [Server].[DBName].[TableName] 
    GROUP BY clinic_id, result_month_id 
    ) 
SELECT *, (AVF+AVC+[AVG]+Other)as Total_Days 
FROM CalculatedValues; 
1

Создать представление о представлении:

CREATE VIEW Rate AS ... 

CREATE VIEW Rate_All AS 
SELECT *, AVC + [AVG] + Other as TotalDays 
FROM Rate;