2013-06-18 2 views
0

J'ai une table en MySQL avec les champs suivants. Date, numéro_bloc, entité, lecturePouvons-nous encore simplifier cette requête MySQL?

Maintenant, je lance ce SQL et obtient les résultats.

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; 

Ceci est une simple requête avec trois entités et champ calculé, mais je dois écrire les requêtes qui implique jusqu'à 15 entités et des champs calculés qui les utilisent. Existe-t-il un moyen de simplifier davantage ces requêtes? l'alias de champ n'est pas autorisé pour les calculs comme je ne peux pas utiliser

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

Veuillez suggérer. Merci

Répondre

7

L'alias de la colonne ne sont pas disponibles dans la même instruction SELECT, mais si vous ne voulez pas réécrire les calculs, vous pouvez utiliser une sous-requête:

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

Vous pouvez regrouper dans une sous-requête pour éviter de répéter la somme():

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

merci .... qui a vraiment aidé ... –