Query maken met logische functie

Status
Niet open voor verdere reacties.

chrispool

Gebruiker
Lid geworden
22 mei 2007
Berichten
5
Ik heb problemen om een efficiente query te maken voor het volgende:

In een database zitten meetgegevens van elektrische apparaten (opwekking en verbruik) in Wh. De structuur van de tabel is vrij generiek omdat er meerdere soorten meetgegevens in moeten kunnen zoals temperatuur, lucthvochtigheid etc.

maar de belangrijkste velden zijn:

id - unit- name - value - timestamp

Nu staan daar de metingen in per minuut. Ik heb het voor elkaar om de resultaten te groeperen per uur, per dag of per minuut met de volgende query:
Code:
"SELECT DATE_FORMAT(timestamp, '$timestring') as timestring, sum(value) as power, device_id, DATE_FORMAT(timestamp, '$resolution_sql_string') as time, timestamp FROM measurements WHERE device_id > '99' AND name = 'Energy Consumption' AND timestamp >= '$period_from' AND timestamp <= '$period_to' GROUP BY time ORDER BY timestamp asc";

Zoals jullie zien haal ik nu alleen de energy consumption op. Hoe kan ik een query maken die energy consumption en production afzonderlijk van elkaar optelt.

Ik begrijp dat ik dan 'name' moet weghalen in de where clause maar hoe bouw ik de logica in om energy consumption en production afzonderlijk van elkaar te laten optellen. Ook kan het voorkomen dat er binnen de group zowel energy production en consumption is.

Code:
"SELECT DATE_FORMAT(timestamp, '$timestring') as timestring, sum(value) as power, device_id, DATE_FORMAT(timestamp, '$resolution_sql_string') as time, timestamp FROM measurements WHERE device_id > '99' AND unit = 'Wh' AND timestamp >= '$period_from' AND timestamp <= '$period_to' GROUP BY time ORDER BY timestamp asc";
 
Je kunt eens proberen met "GROUP BY name, time" maar ik weet niet zeker of dat werkt, anders weet ik het zo ook niet :(
 
Het hangt er een beetje vanaf wat je wilt, met de suggestie van Frats krijg je een regel voor energy consumption en een regel voor production. Mocht je ze afzonderlijk in een kolom willen zou je een case-when statement kunnen gebruiken. Dat werkt dan op deze manier:[sql]SELECT DATE_FORMAT(timestamp, '$timestring') as timestring
, sum(
CASE name
WHEN 'Energy Consumption'
THEN value
ELSE 0
END
) as power_consumption
, sum(
CASE name
WHEN 'Energy Production'
THEN value
ELSE 0
END
) as power_production
, device_id
, DATE_FORMAT(timestamp, '$resolution_sql_string') as time
, timestamp
FROM measurements
WHERE device_id > '99'
AND unit = 'Wh'
AND timestamp >= '$period_from'
AND timestamp <= '$period_to'
GROUP BY time
ORDER BY timestamp asc[/sql]
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan