2016-04-27 4 views
1

私は、次のクエリを持っている:MySQLでフィールドを操作する最も効率的な方法は何ですか?

SELECT DATE(utimestamp) as utimestamp, name, data*2000000 from tData 
where utimestamp BETWEEN '2016-01-01 00:00:00' AND '2016-04-16 00:00:00' 
AND name = 'Valor2' and data>20 
group by YEAR(utimestamp), MONTH(utimestamp), name 
union 
SELECT DATE(utimestamp) as utimestamp, name, data*0.1 from tData 
where utimestamp BETWEEN '2016-01-01 00:00:00' AND '2016-04-16 00:00:00' 
AND name = 'Valor1' and data>20 
group by YEAR(utimestamp), MONTH(utimestamp), name 
order by utimestamp asc 

は「データ」で動作する、より効率的な方法はありますか? UNIONを使用せずにこれを行う方法はありますか?

+0

あなたがチェックアウトしたいかもしれませんhttp://codereview.stackexchange.com –

+0

感謝@ JeffPuckettII、それは非常に興味深い貢献です、この質問はそこにもっと属しています。 –

答えて

1

あなたはcase when thenを使用しようとすることができます:

SELECT DATE(utimestamp) as utimestamp, name, 
case when name = 'Valor1' then data*0.1 
    when name = 'Valor2' then data*2000000 
end 
from tData 
where utimestamp BETWEEN '2016-01-01 00:00:00' AND '2016-04-16 00:00:00' 
and data>20 
group by YEAR(utimestamp), MONTH(utimestamp), name 
order by utimestamp asc 
+0

ケースエンドから結果データを命名する方法はありますか?私はその列を 'name_collector_noname =' Valor1 'とし、name_collector_noname =' Valor2 'そしてデータ* 2000000 end'のときにデータ* 0.1としています。私は最後に '価値として'試しましたが、うまくいきません。 –

0

それは集計関数なしで数学の計算を持っているので、あなたの問題のクエリは、奇妙です。また、年と月ごとに集計していますが、問合せには含めません。

私はクエリで明示的に定義された年と月に2つの別々の列に値を置くために傾斜させることになります。

select year(utimestamp), month(utimestamp), 
     sum(case when name = 'Valor1' then data*0.01 end) as valor1, 
     sum(case when name = 'Valor2' then data*2000000 end) as valor2 
from tData 
where utimestamp between '2016-01-01' and '2016-04-16' and 
     name in ('Valor1', 'Valor2') and 
     data > 20 
group by year(utimestamp), month(utimestamp) 
order by max(utimestamp); 
関連する問題