2016-04-27 4 views
1

Ich habe die folgende Abfrage:Was ist die effizienteste Art mit Feldern in MySQL zu arbeiten?

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 

Gibt es eine effizientere Art und Weise mit ‚Daten‘ des Betriebes? Gibt es eine Möglichkeit, dies zu tun, ohne UNION zu verwenden?

+0

Vielleicht möchten Sie überprüfen http://codereview.stackexchange.com –

+0

Dank @JeffPuckettII, es ist ein sehr interessanter Beitrag, diese Frage gehört da mehr. –

Antwort

1

können Sie versuchen, case when then zu verwenden:

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

Gibt es eine Möglichkeit, die resultierenden Daten vom Fallende aus zu benennen? Ich bekomme diese Spalte als 'case wenn name_collector_noname =' Valor1 'dann Daten * 0.1 wenn name_collector_noname =' Valor2 'dann Daten * 2000000 Ende'. Ich habe am Ende 'als Wert' versucht, aber es funktioniert nicht. –

0

Die Abfrage in Ihrer Frage seltsam ist, weil es eine mathematische Berechnung ohne eine Aggregationsfunktion hat. Und Sie aggregieren nach Jahr und Monat, aber ohne sie in die Abfrage aufzunehmen.

Ich würde geneigt sein, die Werte in zwei getrennten Spalten zu setzen, mit dem Jahr und Monat explizit in der Abfrage definiert:

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); 
Verwandte Themen