Как сделать провал в случае T_SQl

Ниже приведена лишь часть большого запроса. Есть ли лучший способ написать это?

select @a=
 case @pcono
 when '00' then sum(ptdbal00)
 when '01' then sum(ptdbal00)+ sum(ptdbal01)
 when '02' then sum(ptdbal00)+ sum(ptdbal01)+sum(ptdbal02)
 ...



 end 

from accthist
where ...
2 ответа

"Лучше" скорее субъективен, но отличается, да;

;WITH cte AS (
 SELECT ptdbal00 n, 0 m FROM test UNION ALL 
 SELECT ptdbal01 n, 1 m FROM test UNION ALL 
 SELECT ptdbal02 n, 2 m FROM test UNION ALL 
 SELECT ptdbal03 n, 3 m FROM test UNION ALL 
 SELECT ptdbal04 n, 4 m FROM test UNION ALL 
 SELECT ptdbal05 n, 5 m FROM test
)
SELECT @a=SUM(n) FROM cte WHERE m<=@pcono

SQLfiddle для тестирования.

Если честно, похоже, вам, возможно, придется посмотреть на нормализацию базы данных.


как об этом, я думаю, что производительность такая же, но ее легче читать и поддерживать:

select @a=sum(ptdbal00) + 
 case when @pcono >= '01' then sum(ptdbal01) else 0 end+
 case when @pcono >= '02' then sum(ptdbal02) else 0 end+
 case when @pcono >= '03' then sum(ptdbal03) else 0 end+
 case when @pcono >= '04' then sum(ptdbal04) else 0 end+
 case when @pcono >= '05' then sum(ptdbal05) else 0 end+
 case when @pcono >= '06' then sum(ptdbal06) else 0 end+
 ...



 end 

from accthist
where ...

licensed under cc by-sa 3.0 with attribution.