![]() |
|
Archives of the TeradataForumMessage Posted: Tue, 02 Sep 2008 @ 14:04:17 GMT
I am the original poster and again I thank all of the responders. The point was not to save exec time, but rather to have cleaner code. For a really long expression, this would be much more important than in this example. The best solution, from Andy Baker, names the expression at first use, then uses the name thereafter. The code below shows this, but with Andy's extra pair of (...) removed:
sel substr(date,1,7) Yr_Month,
Svc_Ownr_Cd,
Bucket,
case
when cl_amt = 0 and curr_bal > cl_amt then '(0) CL=0 & Bal>CL'
when curr_bal <= cl_amt then '(1) not OL'
else case
when (100 * (curr_bal - cl_amt) / cl_amt)* (named clpct)*
<= 10 then '(2) <= 10%'
when clpct <= 15 then '(3) <= 15%'
when clpct <= 20 then '(4) <= 20%'
when clpct <= 25 then '(5) <= 25%'
else '(6) > 25%'
end
end as OL_Pct,
count(1) Number
from Table
where ...
group by 1,2,3,4
_Other responses_: 1. This method:
...
else case 100 * (curr_bal - cl_amt) / cl_amt
when <= 10 then '(2) <= 10%'
...
elicits: Error 3706: Syntax error: expected something between the when' keyword and '"<="'. 2. Including the expression in the SELECT list does not work, as it is not one of the GROUP vars, nor is it an aggregate:
sel substr(date,1,7) Yr_Month,
Svc_Ownr_Cd,
Bucket,
100 * (curr_bal - cl_amt) / cl_amt (Named mycalc),
case
when cl_amt = 0 and curr_bal > cl_amt then '(0) CL=0 & Bal>CL'
when curr_bal <= cl_amt then '(1) not OL'
else case
when mycalc <= 10 then '(2) <= 10%'
...
3. I did not try a derived table, as the "named" solution was more elegant. Phil Pollack
| ||||||||||||||||||||||||||||||||||||||||||||||||
| | ||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||
| Copyright 2016 - All Rights Reserved | ||||||||||||||||||||||||||||||||||||||||||||||||
| Last Modified: 15 Jun 2023 | ||||||||||||||||||||||||||||||||||||||||||||||||