2013-10-28 13 views
3

Это мой запрос динамически вычисляемых полей:Сумма динамически создаваемых полей в запросе MySQL

SELECT 5 * (`Mean (all)` +0.01735568)/(0.07268901) AS rank1, 
5 * (`CVaR 95` +0.51612)/(0.53212) AS rank2, 
5 * (`Hurst` - 0.2)/(0.7717653) AS rank3, 
5 * (`MaxDD` +6.200000762939453)/(16.200000762939) AS rank4, 
5 * (`Positive % 12` - 0.3)/(1) AS rank5 
FROM `quant1` 

Он отлично работает, но мне нужно добавить еще одно динамическое поле, которое равно Rank1 + rank2 ... + ранг 5. Итак, я добавляю другое поле, например

SELECT 5 * (`Mean (all)` +0.01735568)/(0.07268901) AS rank1, 
5 * (`CVaR 95` +0.51612)/(0.53212) AS rank2, 
5 * (`Hurst` - 0.2)/(0.7717653) AS rank3, 
5 * (`MaxDD` +6.200000762939453)/(16.200000762939) AS rank4, 
5 * (`Positive % 12` - 0.3)/(1) AS rank5, 
rank1+rank2+rank3+rank4+rank5 AS rank 
FROM `quant1` 

Он генерирует сообщение об ошибке «неизвестный столбец rank1». Интересно, что точно такой же запрос отлично работает с MS Access.

Как это исправить?

Спасибо!

ответ

1

В MySQL, вы не можете ссылаться на другие алиасы, бу t вы можете определить переменные в select, поэтому попробуйте это вместо:

SELECT 
    @rank1 := 5 * (`Mean (all)` +0.01735568)/(0.07268901) AS rank1, 
    @rank2 := 5 * (`CVaR 95` +0.51612)/(0.53212) AS rank2, 
    @rank3 := 5 * (`Hurst` - 0.2)/(0.7717653) AS rank3, 
    @rank4 := 5 * (`MaxDD` +6.200000762939453)/(16.200000762939) AS rank4, 
    @rank5 := 5 * (`Positive % 12` - 0.3)/(1) AS rank5, 
    @rank1 + @rank2 + @rank3 + @rank4 + @rank5 AS rank 
FROM `quant1` 

Это уродливое, но оно работает.

+0

Он работает с лучшим временем исполнения 0,04 сек. – user2723490

2

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

SELECT rank1, rank2, rank3, rank4, rank5, 
    rank1 + rank2 + rank3 + rank4 + rank5 AS rank 
FROM 
(

    SELECT 5 * (`Mean (all)` +0.01735568)/(0.07268901) AS rank1, 
    5 * (`CVaR 95` +0.51612)/(0.53212) AS rank2, 
    5 * (`Hurst` - 0.2)/(0.7717653) AS rank3, 
    5 * (`MaxDD` +6.200000762939453)/(16.200000762939) AS rank4, 
    5 * (`Positive % 12` - 0.3)/(1) AS rank5 
    FROM `quant1` 
) AS t 
+0

Это работает ... Время исполнения для 10 000 строк на 0,062 секунды немного хуже, чем решение Маца Киндала ниже. – user2723490

+1

Обратите внимание, что подзапросы исторически не были хороши для оптимизатора. Он улучшился в последней версии MySQL, но он нажимает оптимизатор. –

+0

@MatsKindahl - Да, вы правы, спасибо за подсказку :) –

1

Вы должны способами. 1. Используйте эти запросы как подзапрос:

select R.*,R.rank1+R.rank2+R.rank3+R.rank4+R.rank5 AS rank from (
SELECT 5 * (`Mean (all)` +0.01735568)/(0.07268901) AS rank1, 
5 * (`CVaR 95` +0.51612)/(0.53212) AS rank2, 
5 * (`Hurst` - 0.2)/(0.7717653) AS rank3, 
5 * (`MaxDD` +6.200000762939453)/(16.200000762939) AS rank4, 
5 * (`Positive % 12` - 0.3)/(1) AS rank5 
FROM `quant1` 
) as R 

или 2. в запросе заменить: Rank1 + rank2 + rank3 + Ранг 4 + rank5 с (5 * (Mean (all) +0.01735568)/(0,07268901)) + (5 * (CVaR 95 0,51612)/(0,53212)) ..etc ..

+0

Лично я не рекомендую вариант 2 - они очень быстро выйдут из синхронизации. Использование подзапроса - это, пожалуй, единственный путь. –

+0

Вариант 1 генерирует ошибку: «Код ошибки: 1248 Каждая производная таблица должна иметь свой собственный псевдоним». Вам нужно добавить «AS someTable» в конце – user2723490

+0

. Добавить псевдоним – baltov

0

Попробуйте суб-запрос, например:

SELECT *, rank1+rank2+rank3+rank4+rank5 AS rank 
FROM ( 
    SELECT 5 * (`Mean (all)` +0.01735568)/(0.07268901) AS rank1, 
    5 * (`CVaR 95` +0.51612)/(0.53212) AS rank2, 
    5 * (`Hurst` - 0.2)/(0.7717653) AS rank3, 
    5 * (`MaxDD` +6.200000762939453)/(16.200000762939) AS rank4, 
    5 * (`Positive % 12` - 0.3)/(1) AS rank5, 
    FROM `quant1` 
) QuantRank 
+0

Код ошибки 1064 в строке 8 – user2723490

Смежные вопросы