Groeperen op berekend veld

Status
Niet open voor verdere reacties.

snb

Verenigingslid
Lid geworden
12 jun 2008
Berichten
19.704
Ik wil een csv bestand inlezen met ADODB.
Het csv-bestand heeft 2 velden: tijd en waarde.
In het veld 'tijd' komen tijdstippen van waarnemingen: op de minuut precies.
Met een SQL opdracht kan ik de tijdstippen standaardiseren op uren in plaats van minuten.
Is het vervolgens mogelijk om in dezelfde SQL-opdracht de gegevens te groeperen op uur-nivo ?
Anders gezegd: kan het resultaat een overzicht opleveren van uren met de gemiddelde waarden die in veld 'waarde geregistreerd zijn ?

Omdat mijn vraag over de inrichting van de SQL-opdracht gaat, leek mij het Access-subforum geschikter voor mijn vraag dan een ander subforum.
Als bijlage een klein deel van het CSV-bestand

Deze code gebruik ik nu:

Code:
Sub M_snb()
   c00 = ThisWorkbook.Path & "\"
   c01 = "`waarnemingen.csv`"
   
   With CreateObject("ADODB.Recordset")
     .Open "SELECT int([tijd]) + hour([tijd])/24,  [waarde] FROM " & c01, "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" & c00, 3
     Sheet1.Cells(2, 1).CopyFromRecordset .DataSource
     Sheet1.Columns(2).NumberFormat = "0.00"
   End With
End With
 

Bijlagen

  • waarnemingen.csv
    295,5 KB · Weergaven: 25
De bedoeling is dus om het csv bestand te importeren met een aantal formule uitkomsten in een Excel bestand, en niet in een (al dan niet Access) database? Want bij 'berekend veld' denk ik (binnen dit forum) gelijk aan een tabel met een berekend veld, waarin een berekening gemaakt wordt. Dat is echter een veldinstelling, en regel je niet met een import. Jouw voorbeeldje importeert ook waarden, geen formules.
 
Omdat het veld 'Tijd' niet rechttoe-rechtaan geïmporteerd wordt, maar gewijzigd in een tijdwaarde, afgerond op 1 uur, noem ik het een 'berekend veld'.
Mag je anders noemen.
Als je mijn code gebruikt zie je dat het resultaat in Excel 1 kolom met tijden, afgerond op uren, oplevert en 1 kolom met waarden.
Het is de bedoeling dat ik 1 kolom met unieke tijden overhoudt, met een tweede kolom met het gemiddelde van de waarden die in dat uur gemeten.

Mijn vraag is of dat in 1 SQL-string te realiseren is.
 
Dat had ik gedaan:

"SELECT int([tijd]) + hour([tijd])/24, avg([waarde]) FROM " & c01 & " Group BY int([tijd]) + hour([tijd])/24"
 
Dat werkt? Ik krijg je code niet aan de praat; wellicht omdat ik met 64 bits werk, en jij met 32 bit. Deze query had ik in Access ook al aan de praat na een handmatige import van je csv.
 
Nee, deze SQL-string werkt hier niet.

Waar de gegevens terechtkomen is niet van belang.
Louter in VBA (in Word, Excel. Powerpoint, Outlook, Access of n'importe):

Code:
Sub M_snb()
   c00 = ThisWorkbook.Path & "\"
   c01 = "`waarnemingen.csv`"
   
   With CreateObject("ADODB.Recordset")
     .Open "SELECT int([tijd]) + hour([tijd])/24,  [waarde] FROM " & c01, "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" & c00, 3
      sn=.Getrows
   End With
End With

De vorige SQL-string (met group by) geeft immer een 'automation error'.
 
Bij mij doet de Text Driver het niet. Dus in Excel kan ik e.e.a. niet testen.
 
Hoe ziet jouw macro iin Access eruit als je het csv-bestand importeert met de criteria die ik aangaf ?
 
Het blijkt lastig om de berekening te maken tijdens de import. Lukt mij ook niet. Wél krijg ik het csv bestand geopend zonder problemen, maar niet met een berekening er gelijk bij. Daar is een tweede recordset voor nodig, op basis van de eerste uiteraard.
 
De tijden afronden op uren lukt mij met de eerste geplaatste code.
Hoe ik de ontstane recordset weer zou moeten filteren ? Kzou nie wetu.
 
Dat is het punt: de Group By lukt niet. En jouw code doet het bij mij niet. Wellicht in een voorbeeldje.
 
Met dank aan alle bijdragers.
Uiteindelijk is het dit geworden:

Code:
Sub M_snb()
  Application.ScreenUpdating = False
   
  c00 = "G:\OF\"
  c01 = "`__urenoverzicht_snb.csv`"
  Sheet1.Cells(1).Resize(, 2) = Split("uur waarde")
   
  With CreateObject("ADODB.Recordset")
    .Open "SELECT int([From]) + hour([From])/24, 0.0000 +[PM25]  FROM " & c01, "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" & c00
    Sheet1.Cells(2, 1).CopyFromRecordset .DataSource
  End With
   
  With CreateObject("ADODB.Recordset")
    .Open "SELECT uur, avg(waarde)  FROM `Sheet1$` GROUP BY uur ", "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=Yes"""
    Sheet1.Cells(1).CurrentRegion.Offset(1).ClearContents
    Sheet1.Columns(2).NumberFormat = "0.00"
    Sheet1.Cells(2, 1).CopyFromRecordset .DataSource
  End With
End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan