Jochem van Dieten <[EMAIL PROTECTED]> wrote on 11/07/2005 03:32:25 PM:

> On 11/7/05, mos wrote:
> > Why isn't there a way to reference column aliases in the columns list 
or
> > where clause?
> 
> Because the SQL standad says so. See chapter 7 of ISO/IEC 9075-2:2003.
> 
> 
> > select if(score<50,-5,0) failing_score, if(score>50, 1, 0) 
passing_score,
> > attendance/totaldays Percent_Attendance ,
> > failing_score/passing_score*percent_attendance
> > from schoolwork
> >
> > (There is no logic to the columns so please don't try to replace the 
code
> > with something simpler)
> 
> Not simpler, but equivalent and preventing double execution:
> 
> SELECT *, failing_score/passing_score*percent_attendance
> FROM (
> SELECT
>   if(score<50,-5,0) failing_score,
>   if(score>50, 1, 0) passing_score,
>   attendance/totaldays Percent_Attendance
> FROM
>   schoolwork
> ) tmp_result
> 
> Jochem

Alternatively, you *might* be able to get away with using per-row 
variables:

SELECT @Pass := if(score<50, -5 ,0) passing_score
        , @Fail := if(score>50,1,0) failing_score
        , @pctAtt := if(totaldays!=0, attendance/totaldays, NULL) 
Percent_Attendance
        , if(@[EMAIL PROTECTED] !=0, @fail/@pass * @pctAtt, NULL)
FROM schoolwork;

I don't have your data so I can't test this to make sure it's going to 
evaluate in the correct order. I don't use per-row evaluation enough to 
know off the op of my head if this will work or not. However, I have seen 
this pattern elsewhere so I offer it as something to try.

Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine

Reply via email to