2016-04-27 66 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 ='Valor2',那么数据* 2000000结束'时,我将该列作为'case name_collector_noname ='Valor1'时的数据* 0.1'。我在最后尝试了'作为价值',但它不起作用。 –

0

你的问题的查询是奇怪的,因为它有没有一个聚合功能的数学运算。而且,按年份和月份进行汇总,但不包括在查询中。

我会倾向于把值在两个单独的列,年份和月份在查询中明确定义:

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); 
相关问题