2013-06-18 6 views
0

У меня есть таблица в MySQL со следующими полями. Дата, block_no, entity,Можем ли мы упростить этот запрос MySQL?

Теперь я запускаю этот SQL и получаю результаты.

SELECT DATE,block_no, 
SUM(IF(entity='KS',READING,0)) AS KS, 
SUM(IF(entity='KB',READING,0)) AS KB, 
SUM(IF(entity='V1',READING,0)) AS V1, 
(SUM(IF(entity='KS',READING,0)) + SUM(IF(entity='KB',READING,0)))/SUM(IF(entity='V1',READING,0)) AS "New Rate" 
FROM dbf_sdl 
GROUP BY DATE,block_no; 

Это простой запрос с тремя лицами и вычисленного поля, но я должен писать запросы, которые включает в себя ДО 15 лиц и некоторых вычисляемых полей, используя их. Есть ли способ, которым эти запросы могут быть упрощены дальше? полевой псевдоним не допускается для расчетов, как я не могу использовать

(KS+KB)/V1 AS "New Rate" 

Просьба предложить. Благодаря

ответ

7

Столбца псевдоним не доступен для использования в том же ЗЕЬЕСТЕ, но если вы не хотите, чтобы переписать расчеты, то вы можете использовать подзапрос:

select DATE,block_no, KS, KB, V1, 
    (KS+KB)/V1 AS "New Rate" 
from 
(
    SELECT DATE,block_no, 
    SUM(IF(entity='KS',READING,0)) AS KS, 
    SUM(IF(entity='KB',READING,0)) AS KB, 
    SUM(IF(entity='V1',READING,0)) AS V1 
    FROM dbf_sdl 
    GROUP BY DATE,block_no 
) d 
2

Вы можете агрегировать в подзапроса чтобы избежать повторения SUM():

SELECT *,(KS+KB)/V1 AS "New Rate" 
FROM (SELECT DATE,block_no, 
     SUM(IF(entity='KS',READING,0)) AS KS, 
     SUM(IF(entity='KB',READING,0)) AS KB, 
     SUM(IF(entity='V1',READING,0)) AS V1, 
     FROM dbf_sdl 
     GROUP BY DATE,block_no 
    )as Sub; 
+0

спасибо .... это действительно помогло ... –

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