MYSQL query

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • BjorntobeWild
  • Registratie: Januari 2005
  • Laatst online: 17-03-2023
Ik heb een MySQL database met daarin een tabel welke als volgt is opgebouwd:
DatumLeveren_T1LeverenT2Verbruik_T1Verbruik_T2
2001-01-0115.003.002.005.00
2001-01-0213.552.255.324.25


Nu wil ik een query maken om dit weer te geven in een tabel welke ik later ga gebruiken om een grafiek van te maken. Het resultaat van de tabel moet er als volgt uitzien:

MaandEnergiehoeveelheidTariefCategorie
2001-jan4501Verbruik
2001-jan4122Verbruik
2001-jan251Levering
2001-jan02Levering
2001-feb5641Verbruik
2001-feb452Verbruik
2001-feb01Levering
2001-feb102Levering


Met de volgende query krijg ik de data er wel uit, maar niet met het gewenste resultaat.
code:
1
SELECT DATE_FORMAT((stamp), '%M %Y') AS Maand, SUM(verbruik_1) AS 'Hoog tarief', SUM(verbruik_2) AS 'Laag tarief', SUM(terugleveren_1) AS 'Terugleveren hoog tarief', SUM(terugleveren_2) AS 'Terugleveren laag tarief' FROM energy_week WHERE idx=135 group by YEAR(stamp), MONTH(stamp) ORDER BY stamp ASC


Ik wil graag weten hoe ik de kolommen Tarief en Categorie moet maken in MySQL.

Beste antwoord (via BjorntobeWild op 06-05-2021 10:23)


  • CyBeRSPiN
  • Registratie: Februari 2001
  • Laatst online: 16:06

CyBeRSPiN

sinds 2001

Ja met een union.
Even uit de losse pols op mn iPad, maar iets als dit zou moeten werken:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Select maand, sum(kWh) as energiehoeveelheid, tarief, categorie
From (
Select t1.maand, t1.verbruik_T1 as kWh, 1 as tarief, “Verbruik” as categorie
From meterstand_tabel t1

UNION ALL

Select t2.maand, t2.verbruik_T2 as kWh, 2 as tarief, “Verbruik” as categorie
From meterstand_tabel t2

UNION ALL

Select t3.maand, t3.leveren_T1 as kWh, 1 as tarief, “Leveren” as categorie
From meterstand_tabel t3

UNION ALL

Select t4.maand, t4.leveren_T2 as kWh, 2 as tarief, “Leveren” as categorie
From meterstand_tabel t4

) 
Group by maand, tarief, categorie

[ Voor 6% gewijzigd door CyBeRSPiN op 05-05-2021 23:01 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • g0tanks
  • Registratie: Oktober 2008
  • Laatst online: 15:49

g0tanks

Moderator CSA
Ik denk dat het met UNION moet kunnen: https://stackoverflow.com...o-unpivot-columns-to-rows

Ultrawide gaming setup: AMD Ryzen 7 2700X | NVIDIA GeForce RTX 2080 | Dell Alienware AW3418DW


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • CyBeRSPiN
  • Registratie: Februari 2001
  • Laatst online: 16:06

CyBeRSPiN

sinds 2001

Ja met een union.
Even uit de losse pols op mn iPad, maar iets als dit zou moeten werken:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Select maand, sum(kWh) as energiehoeveelheid, tarief, categorie
From (
Select t1.maand, t1.verbruik_T1 as kWh, 1 as tarief, “Verbruik” as categorie
From meterstand_tabel t1

UNION ALL

Select t2.maand, t2.verbruik_T2 as kWh, 2 as tarief, “Verbruik” as categorie
From meterstand_tabel t2

UNION ALL

Select t3.maand, t3.leveren_T1 as kWh, 1 as tarief, “Leveren” as categorie
From meterstand_tabel t3

UNION ALL

Select t4.maand, t4.leveren_T2 as kWh, 2 as tarief, “Leveren” as categorie
From meterstand_tabel t4

) 
Group by maand, tarief, categorie

[ Voor 6% gewijzigd door CyBeRSPiN op 05-05-2021 23:01 ]


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Je issue is eigenlijk vooral dat je datamodel 'verkeerd' is waardoor je het jezelf nu moelijk maakt. Het komt er kortweg op neer dat als je meer devices moet toevoegen je meer kolommen toe moet voegen, je verkeerd bezig bent.

Uiteindelijk maak je het jezelf makkelijker als je overgaat naar een datum, device id, leveren, verbruik tabel gaat werken waar je voor "t1" en "t2" aparte regels insert.

https://niels.nu


Acties:
  • +1 Henk 'm!

  • BjorntobeWild
  • Registratie: Januari 2005
  • Laatst online: 17-03-2023
Hydra schreef op donderdag 6 mei 2021 @ 10:11:
Je issue is eigenlijk vooral dat je datamodel 'verkeerd' is waardoor je het jezelf nu moelijk maakt. Het komt er kortweg op neer dat als je meer devices moet toevoegen je meer kolommen toe moet voegen, je verkeerd bezig bent.

Uiteindelijk maak je het jezelf makkelijker als je overgaat naar een datum, device id, leveren, verbruik tabel gaat werken waar je voor "t1" en "t2" aparte regels insert.
Er zit ook een kolom 'id' in de tabel, deze heb ik gemakshalve weggelaten. Met de query van @CyBeRSPiN (iets aangepast) lukte het wel de juiste output te krijgen.

Thnx!

Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
BjorntobeWild schreef op donderdag 6 mei 2021 @ 10:25:
[...]


Er zit ook een kolom 'id' in de tabel, deze heb ik gemakshalve weggelaten
Dat is niet wat @Hydra zegt noch bedoelt ;)
Lees je eens in in databasenormalisatie. Je model is "fout". Je wil een tabel met "devices"(?) en in je huidige tabel wil je daar naar verwijzen i.p.v. voor elk ding een nieuwe kolom te moeten maken.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • BjorntobeWild
  • Registratie: Januari 2005
  • Laatst online: 17-03-2023
RobIII schreef op donderdag 6 mei 2021 @ 10:42:
[...]

Dat is niet wat @Hydra zegt noch bedoelt ;)
Lees je eens in in databasenormalisatie. Je model is "fout". Je wil een tabel met "devices"(?) en in je huidige tabel wil je daar naar verwijzen i.p.v. voor elk ding een nieuwe kolom te moeten maken.
Ik begrijp wat je bedoelt met de normalisatie van databases. Ben er ook wel (een beetje) mee bekend. Dit is echter een tabel uit Domoticz welke ik rechtstreeks heb geïmporteerd naar mysql.
In deze tabel staan maar twee devices (de energiemeter en de zonnepanelen). Beide zijn weergegeven als een integer. Namelijk 135 voor de verbruikte energie van de energiemeter en 145 voor de opgewekte energie van de zonnepanelen.

Naar mijn inziens is er niks mis met de manier waarop de tabel momenteel is opgebouwd. Indien ik de verbruikte of opgewekte energiehoeveelheden per maand wil uitlezen dan kan ik dat met de eerder genoemde query weergeven.

Mijn doel met de gevraagde query was om de tabel op een andere manier weer te geven omdat ik de data wil visualiseren in een Highcharts grafiek (als gestapelde en gegroepeerde kolom) zie linkje. De grafiek wordt gegenereerd aan de hand van de data in de tabel, alleen werkt nog niet zoals ik had verwacht.

Ik zal dus nog even door moeten puzzelen. :)

Acties:
  • 0 Henk 'm!

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 12:34
BjorntobeWild schreef op donderdag 6 mei 2021 @ 16:35:
[...]
Naar mijn inziens is er niks mis met de manier waarop de tabel momenteel is opgebouwd. Indien ik de verbruikte of opgewekte energiehoeveelheden per maand wil uitlezen dan kan ik dat met de eerder genoemde query weergeven.

Mijn doel met de gevraagde query was om de tabel op een andere manier weer te geven omdat ik de data wil visualiseren in een Highcharts grafiek (als gestapelde en gegroepeerde kolom) zie linkje. De grafiek wordt gegenereerd aan de hand van de data in de tabel, alleen werkt nog niet zoals ik had verwacht.
Die grafiek zit toch al in Domoticz op de http://domoticz:8080/#/Devices/<deviceId>/Report pagina? De Domoticz pagina gebruikt het API endpoint
http://domoticz:8080/json.htm?actyear=2021&idx=1&range=year&sensor=counter&type=graph en doet het groeperen per maand en het maken van een Highcharts grafiek in het JavaScript bestand EnergyMultiCounterReport.js.

De Domoticz tabel is inderdaad niet genormaliseerd, maar een kolom voor dal- en normaaltarief is misschien nog niet eens zo raar. Nog erger, de tabel MultiMeter_Calendar heeft kolommen genaamd Value1 t/m Value6 en Counter1 t/m Counter4 :X

Als je de broncode van het endpoint om de gegevens als JSON op te halen bekijkt breekt helemaal je klomp 8)7
Pagina: 1